将转义的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包含字符“\ u0161”而不是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将适合)