2011-10-22 52 views
15

我试图从数组中读取来自plist的字符串并打印这些字符串。将转义的UTF8字符转换回它们的原始形式

数组中的字符串包含转义的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对象,但没有在工作所有。

我真的很感谢你的任何指示,可能会帮助我解决这个看似平淡的问题。

回答

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; 
} 
+0

非常感谢你,伙计!这就是诀窍:) – Tobi

+0

伟大的一段代码。谢谢。 –

+0

@Tobi如果有效,为什么你不能将它标记为答案? – DroidHeaven

1

其他的解决办法是分析列表的字符串(我用来解析之前建立它)

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

(貌似克罗地亚语,我觉得LATIN1将适合正确)

相关问题