我正在尝试从来自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字符串,然后创建一个UTF8编码的NSString
对象,但都不起作用。
我真的很感谢你的任何建议,这些建议可能会帮助我解决这个看似平凡的问题。
发布于 2011-10-23 01:30:22
听起来plist中的字符串包含字符"\u0161“,而不是Unicode字符数字0x161。因此,您需要解码从plist中提取的字符串中的\u转义。使用NSNonLossyASCIIStringEncoding
,NSString
可以为您做到这一点
#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;
}
发布于 2017-01-11 16:34:07
另一种解决方案是解析你的列表字符串(我习惯于在构建它之前解析它)
NSString yourFinalString = [NSString stringWithCString:[yourOriginalString cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
(看起来像克罗地亚语,我认为latin1会很适合)
https://stackoverflow.com/questions/7860867
复制相似问题