如何通过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..."(没有斜杠),请尝试从正则表达式中删除 \\

正则表达式的第二部分 (|.) 按原样处理非转义字符。

注意事项

您可能还想通过设置适当的正则表达式选项使匹配不区分大小写。

这不处理无效字符代码。

这不是最高效的解决方案,您最好使用适当的解析库大规模执行此操作。

相关文档和链接

只需将此短语复制并粘贴到 python shell 并按“Enter”,您将看到波斯语或波斯语的此短语。结果是:اومیل آدرس