将转义的UTF8字符转换回原始格式

时间:2011-10-22 16:21:16

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

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

数组中的字符串包含转义的UTF8字符 - 例如,当从plist中读取时,“NušaFlorjanč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对象,但根本没有任何效果。

我真的很感激你的任何指示,这可能有助于我解决这个看似平凡的问题。

2 个答案:

答案 0 :(得分:41)

听起来plist中的字符串包含字符“\ u016​​1”而不是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;
}

答案 1 :(得分:1)

其他解决方案是解析你的列表字符串(我之前用它来解析它)

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

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