【问题标题】:How to display persian script through unicode如何通过unicode显示波斯文字
【发布时间】:2018-05-01 12:00:59
【问题描述】:

请有人帮我用波斯文字显示这个字符串:“\u0622\u062f\u0631\u0633 \u0627\u06cc\u0645\u06cc\u0644”

我尝试过使用

NSData *data = [yourtext dataUsingEncoding:NSUTF8StringEncoding];
NSString *decodevalue = [[NSString alloc] initWithData:dataencoding:NSNonLossyASCIIStringEncoding];

然后返回:u0622u062fu0631u0633 u0627u06ccu0645u06ccu0644

我想要目标 C 的相同解决方案:https://www.codeproject.com/Questions/714169/Conversion-from-Unicode-to-Original-format-csharp

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • “yourtext”里面有什么?你从哪里得到它?如果它已经在 UTF-8 中,为什么不能直接显示呢?用NSLog(@"%@", yourtext) 打印什么?
  • @battlmonstr 这是打印的日志:u0622u062fu0631u0633 u0627u06ccu0645u06ccu0644 我仍然卡在里面。请帮忙。
  • 您希望如何在控件或自定义视图中显示字符串?哪个操作系统?
  • po @"\u0622\u062f\u0631\u0633 \u0627\u06cc\u0645\u06cc\u0644" 记录“آدرس ایمیل”,我不知道这是否是 Perian,但 Google 会将其翻译成“电子邮件”。 NSTextField 显示“آدرس ایمیل”。

标签: objective-c unicode localization persian


【解决方案1】:

我假设您的输入字符串具有反斜杠转义代码(就像它在源代码文件中逐字一样),并且您希望将转义序列解析为 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,并从中构建一个字符串。

注意正则表达式中的\\\\,因为首先objc编译了一层斜线,它变成\\,然后正则表达式编译器去掉了第二层斜线,它变成了\,用于精确匹配。如果您只有“u0622u062f...”(没有斜杠),请尝试从正则表达式中删除 \\\\

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

注意事项

您还可能希望通过设置正确的正则表达式选项来使匹配不区分大小写。

这不处理无效的字符代码。

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

相关文档和链接

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多