如何通过unicode显示波斯文字
How to display persian script through unicode
谁能帮我用波斯文显示这个字符串:“\u0622\u062f\u0631\u0633 \u0627\u06cc\u0645\u06cc\u0644”
我试过使用
NSData *data = [yourtext dataUsingEncoding:NSUTF8StringEncoding];
NSString *decodevalue = [[NSString alloc] initWithData:dataencoding:NSNonLossyASCIIStringEncoding];
并返回:u0622u062fu0631u0633 u0627u06ccu0645u06ccu0644
我想要 objective C 的相同解决方案:https://www.codeproject.com/Questions/714169/Conversion-from-Unicode-to-Original-format-csharp
我假设你的输入字符串有反斜杠转义代码(就像它在源代码文件中逐字一样),你想将转义序列解析成一个 unicode 字符串,并且还想保留未转义的角色原样。
这是我想出的:
NSError *badRegexError;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\u([a-f0-9]{4})|.)" options:0 error:&badRegexError];
if (badRegexError) {
NSLog(@"bad regex: %@", badRegexError);
return;
}
NSString *input = @"\u0622\u062f\u0631\u0633 123 test -_- \u0627\u06cc\u0645\u06cc\u0644";
NSMutableString *output = [NSMutableString new];
[regex enumerateMatchesInString:input options:0 range:NSMakeRange(0, input.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{
NSRange codeRange = [result rangeAtIndex:2];
if (codeRange.location != NSNotFound) {
NSString *codeStr = [input substringWithRange:codeRange];
NSScanner *scanner = [NSScanner scannerWithString:codeStr];
unsigned int code;
if ([scanner scanHexInt:&code]) {
unichar c = (unichar)code;
[output appendString:[NSString stringWithCharacters:&c length:1]];
}
} else {
[output appendString:[input substringWithRange:result.range]];
}
}];
NSLog(@" actual: %@", output);
NSLog(@"expected: %@", @"\u0622\u062f\u0631\u0633 123 test -_- \u0627\u06cc\u0645\u06cc\u0644");
说明
这是使用正则表达式查找 6 个字符的块,例如 \uXXXX
,例如 \u062f
。它将代码提取为字符串,如 062f
,然后使用 NSScanner.scanHexInt 将其转换为数字。它假定此数字是有效的 unichar
,并从中构建一个字符串。
注意regex中的\\
,因为首先objc编译器去掉了一层斜杠,变成了\
,然后regex编译器去掉了第二层斜杠,变成了\
用于精确匹配。如果您只有 "u0622u062f..."(没有斜杠),请尝试从正则表达式中删除 \\
。
正则表达式的第二部分 (|.
) 按原样处理非转义字符。
注意事项
您可能还想通过设置适当的正则表达式选项使匹配不区分大小写。
这不处理无效字符代码。
这不是最高效的解决方案,您最好使用适当的解析库大规模执行此操作。
相关文档和链接
- https://developer.apple.com/documentation/foundation/nsregularexpression?language=objc
- https://developer.apple.com/documentation/foundation/nsregularexpression/1409687-enumeratematchesinstring?language=objc
- How do you use NSRegularExpression's replacementStringForResult:inString:offset:template:
- https://developer.apple.com/documentation/foundation/nstextcheckingresult?language=objc
- xcode UTF-8 literals
- Objective-C parse hex string to integer
只需将此短语复制并粘贴到 python shell 并按“Enter”,您将看到波斯语或波斯语的此短语。结果是:اومیل آدرس
谁能帮我用波斯文显示这个字符串:“\u0622\u062f\u0631\u0633 \u0627\u06cc\u0645\u06cc\u0644”
我试过使用
NSData *data = [yourtext dataUsingEncoding:NSUTF8StringEncoding];
NSString *decodevalue = [[NSString alloc] initWithData:dataencoding:NSNonLossyASCIIStringEncoding];
并返回:u0622u062fu0631u0633 u0627u06ccu0645u06ccu0644
我想要 objective C 的相同解决方案:https://www.codeproject.com/Questions/714169/Conversion-from-Unicode-to-Original-format-csharp
我假设你的输入字符串有反斜杠转义代码(就像它在源代码文件中逐字一样),你想将转义序列解析成一个 unicode 字符串,并且还想保留未转义的角色原样。
这是我想出的:
NSError *badRegexError;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\u([a-f0-9]{4})|.)" options:0 error:&badRegexError];
if (badRegexError) {
NSLog(@"bad regex: %@", badRegexError);
return;
}
NSString *input = @"\u0622\u062f\u0631\u0633 123 test -_- \u0627\u06cc\u0645\u06cc\u0644";
NSMutableString *output = [NSMutableString new];
[regex enumerateMatchesInString:input options:0 range:NSMakeRange(0, input.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{
NSRange codeRange = [result rangeAtIndex:2];
if (codeRange.location != NSNotFound) {
NSString *codeStr = [input substringWithRange:codeRange];
NSScanner *scanner = [NSScanner scannerWithString:codeStr];
unsigned int code;
if ([scanner scanHexInt:&code]) {
unichar c = (unichar)code;
[output appendString:[NSString stringWithCharacters:&c length:1]];
}
} else {
[output appendString:[input substringWithRange:result.range]];
}
}];
NSLog(@" actual: %@", output);
NSLog(@"expected: %@", @"\u0622\u062f\u0631\u0633 123 test -_- \u0627\u06cc\u0645\u06cc\u0644");
说明
这是使用正则表达式查找 6 个字符的块,例如 \uXXXX
,例如 \u062f
。它将代码提取为字符串,如 062f
,然后使用 NSScanner.scanHexInt 将其转换为数字。它假定此数字是有效的 unichar
,并从中构建一个字符串。
注意regex中的\\
,因为首先objc编译器去掉了一层斜杠,变成了\
,然后regex编译器去掉了第二层斜杠,变成了\
用于精确匹配。如果您只有 "u0622u062f..."(没有斜杠),请尝试从正则表达式中删除 \\
。
正则表达式的第二部分 (|.
) 按原样处理非转义字符。
注意事项
您可能还想通过设置适当的正则表达式选项使匹配不区分大小写。
这不处理无效字符代码。
这不是最高效的解决方案,您最好使用适当的解析库大规模执行此操作。
相关文档和链接
- https://developer.apple.com/documentation/foundation/nsregularexpression?language=objc
- https://developer.apple.com/documentation/foundation/nsregularexpression/1409687-enumeratematchesinstring?language=objc
- How do you use NSRegularExpression's replacementStringForResult:inString:offset:template:
- https://developer.apple.com/documentation/foundation/nstextcheckingresult?language=objc
- xcode UTF-8 literals
- Objective-C parse hex string to integer
只需将此短语复制并粘贴到 python shell 并按“Enter”,您将看到波斯语或波斯语的此短语。结果是:اومیل آدرس