将转义的UTF8字符转换回原来的forms

我试图从一个数组中读取来自plist的string并打印这些string。

数组中的string包含转义的UTF8字符 – 例如,当从plist中读取时,“NušaFlorjančič”变成"Nu\u0161a Florjan\u010di\u010d" 。 没有办法改变plist的内容,但我的程序需要正确显示名称。

奇怪的是Objective-C似乎在我对string进行硬编码时会自动执行此操作。 但是,如果我从plist得到的string什么都没有发生。

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

 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 

我已经尝试了各种各样的东西,包括将string转换为Cstring,然后用UTF-8编码创build一个NSString对象,但没有任何工作。

我真的很感谢你的指点,可以帮助我解决这个看似平淡的问题。

听起来像plist中的string包含字符“\ u016​​1”而不是Unicode字符编号0x161。 所以你需要解码你从plist中提取的string中的\ 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; } 

其他解决scheme是parsing你的列表string(我曾经parsing它之前构build它)

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

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