我将NSString转换为UTF8 cString时遇到奇怪的编码问题。我正在从网络服务器获取XML数据。 XML使用UTF-8编码正确编码。获取数据后,我将其转换为NSString,如下所示:
NSString *XMLdata = [[[NSString alloc] initWithData: receivedData encoding: NSUTF8StringEncoding] autorelease];
当我使用NSLog将结果写入stdout时,输出似乎没问题(所有字符都是可读的)。
但是当我尝试使用[XMLData UTF8String]或[XMLDdata cStringWithEncoding:NSUTF8StringEncoding]获取cString时,非ascii字符(在这种情况下为德语)被搞砸了(例如“N√ºrnberg”而不是“Nürnberg”)。
我不知道这有什么问题。我错过了什么或是那个错误吗?
感谢任何帮助,谢谢! 马特斯
答案 0 :(得分:3)
马特斯,你正确地做到了。两次转换都做得很好,显然你得到了正确的输出。您看到的奇怪结果是NSLog无法使用UTF-8编码解释C字符串的结果。
尝试以下代码。我把“Nürnberg”的UTF-8编码放在s[]
中。 ü
字符由双字节序列0xc3,0xbc表示。其余字符的编码方式与ASCII等效字符相同。 (使用UTF Converter和UTF-8 encoding demo table进行验证。
char s[] = { 0x4e, 0xc3, 0xbc, 0x72, 0x6e, 0x62, 0x65, 0x72, 0x67, 0 };
printf(s); printf("\n");
NSLog(@"%s", s);
在调试器的控制台窗口中,您应该获得以下内容:
Nürnberg
2009-08-12 23:55:53.077 try8[4980:813] Nürnberg
您在NSLog输出中看到的√º
字符来自Mac OS Roman encoding。如果你按照这个链接,你会发现确定,0xc3映射到√
字符,0xbc映射到º
。显然,这是NSLog对C字符串的编码。
答案 1 :(得分:0)
感谢您的回复,但我的问题是,不仅NSLog显示错误的字符,而且当解析XML(使用TinyXML)并且数据保存到sqlite db(使用CoreData)时,也会保存错误的字符。 / p>
我知道那些字符是多字节序列,但是我不明白为什么当它转换为cString时显然没有正确处理...
无论如何,现在我已经尝试调用[XMLData cStringWithEncoding:NSMacOSRomanStringEncoding]并且这样做了 - 所以谢谢你指点我的方式!
偶然的,你知道如何确定系统使用的编码吗?阅读参考,我意识到编码取决于系统设置(语言,区域等)。我试图通过调用[NSString defaultCStringEncoding]来弄明白,但它返回nil ...我想知道是否有一些一致的方法如何处理这种情况的各种编码(下次我可以面对东欧或其他什么其他人)。
再次感谢,最好
马特斯