NSString到cString UTF-8转换问题

时间:2009-08-13 05:56:39

标签: character-encoding nsstring

我将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”)。

我不知道这有什么问题。我错过了什么或是那个错误吗?

感谢任何帮助,谢谢! 马特斯

2 个答案:

答案 0 :(得分:3)

马特斯,你正确地做到了。两次转换都做得很好,显然你得到了正确的输出。您看到的奇怪结果是NSLog无法使用UTF-8编码解释C字符串的结果。

尝试以下代码。我把“Nürnberg”的UTF-8编码放在s[]中。 ü字符由双字节序列0xc3,0xbc表示。其余字符的编码方式与ASCII等效字符相同。 (使用UTF ConverterUTF-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 ...我想知道是否有一些一致的方法如何处理这种情况的各种编码(下次我可以面对东欧或其他什么其他人)。

再次感谢,最好

马特斯