【问题标题】:Converting escaped UTF8 characters back to their original form将转义的 UTF8 字符转换回其原始形式
【发布时间】:2011-12-13 05:40:30
【问题描述】:

我正在尝试从来自 plist 的数组中读取字符串并打印这些字符串。

数组中的字符串包含转义的 UTF8 字符 - 例如,从 plist 读取时,“Nuša Florjančič”变为"Nu\u0161a Florjan\u010di\u010d"。无法更改 plist 的内容,但我的程序需要正确显示名称。

奇怪的是,当我对字符串进行硬编码时,Objective-C 似乎会自动执行此操作。但是,如果我从 plist 中获取字符串,则什么也不会发生。

举个例子,下面是一些代码:

NSString *name1 = @"Nu\u0161a Florjan\u010di\u010d";
NSString *name2 = [list objectAtIndex:0];       
NSLog(@"name 1: %@", name1);
NSLog(@"name 2: %@", name2);

[list objectAtIndex:0] 包含@"Nu\u0161a Florjan\u010di\u010d" - 唯一的区别是它是通过 plist 编辑器设置的。

控制台输出为:

2011-10-22 18:00:02.595 Test[13410:11c03] name 1: Nuša Florjančič
2011-10-22 18:00:02.595 Test[13410:11c03] name 2: Nu\u0161a Florjan\u010di\u010d

我尝试了各种方法,包括将字符串转换为 C 字符串,然后使用 UTF-8 编码创建 NSString 对象,但都没有任何效果。

非常感谢您的任何建议,以帮助我解决这个看似平凡的问题。

【问题讨论】:

    标签: ios objective-c string cocoa-touch nsstring


    【解决方案1】:

    听起来 plist 中的字符串包含字符“\u0161”而不是 Unicode 字符号 0x161。因此,您需要解码从 plist 中提取的字符串中的 \u 转义。 NSString 可以使用 NSNonLossyASCIIStringEncoding 为您做到这一点:

    #import <Foundation/Foundation.h>
    int main (int argc, const char * argv[])
    {
        @autoreleasepool {
            NSString *name2escaped = @"Nu\\u0161a Florjan\\u010di\\u010d";
            NSString *name2 = [NSString
                stringWithCString:[name2escaped cStringUsingEncoding:NSUTF8StringEncoding]
                encoding:NSNonLossyASCIIStringEncoding];
            NSLog(@"name2 = %@", name2);
        }
        return 0;
    }
    

    【讨论】:

    • 谢谢,这对我也有帮助!
    • 这个解决方案与使用 CFStringTransform 在两者的优缺点方面相比如何?这个对我来说是新的。
    • @uchuugaka 首先告诉我如何使用CFStringTransform来进行这个转换。
    • Boolean CFStringTransform ( CFMutableStringRef 字符串, CFRange *range, CFStringRef 变换, Boolean reverse );基本上,您提供一个 CFMutableString、要操作的范围、作为字符串的 ICU 转换(或作为小子集包装器的 CF 常量之一),最后是一个布尔值,是否按照提供的转换字符串的顺序进行转换或反转它。 (例如“Hex-Any”)相同的 ICU 转换在 cocoa 中的 good 下的其他地方使用,并且在 Java 中可以找到。 Cocoa 在很多地方都使用了 ICU 库。
    • @robmayoff 以stackoverflow.com/a/11615076/104790为例。
    【解决方案2】:

    其他解决方案是解析您的列表字符串(我曾经在构建它之前解析它)

    NSString yourFinalString = [NSString stringWithCString:[yourOriginalString cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
    

    (看起来像克罗地亚语,我认为 latin1 适合)

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多