Character encoding NSString到cString UTF-8转换问题

Character encoding NSString到cString UTF-8转换问题,character-encoding,nsstring,Character Encoding,Nsstring,我在将NSString转换为UTF8 cString时遇到了奇怪的编码问题。我正在从Web服务器获取XML数据。XML使用UTF-8编码正确编码。获取数据后,我将其转换为NSString,如下所示: NSString *XMLdata = [[[NSString alloc] initWithData: receivedData encoding: NSUTF8StringEncoding] autorelease]; 当我使用NSLog将结果写入stdout时,输出似乎正常(所有字符都可读)

我在将NSString转换为UTF8 cString时遇到了奇怪的编码问题。我正在从Web服务器获取XML数据。XML使用UTF-8编码正确编码。获取数据后,我将其转换为NSString,如下所示:

NSString *XMLdata = [[[NSString alloc] initWithData: receivedData encoding: NSUTF8StringEncoding] autorelease];
当我使用NSLog将结果写入stdout时,输出似乎正常(所有字符都可读)

但是,当我尝试使用[XMLData UTF8String]或[XMLData cStringWithEncoding:NSUTF8StringEncoding]获取cString时,非ascii字符(在本例中为德语)是固定的(例如“N√“纽伦堡”而不是“纽伦堡”)

我不知道那有什么问题。我是遗漏了什么还是有什么问题

感谢您的帮助,谢谢!
马特斯

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

试试下面的代码。我把“纽伦堡”的UTF-8编码放在
s[]
中。
u
字符由两字节序列0xc3、0xbc表示。其余字符的编码与其ASCII等效字符相同。(使用和验证)

在调试器的控制台窗口中,应获得以下信息:

Nürnberg
2009-08-12 23:55:53.077 try8[4980:813] Nürnberg

ü
您在NSLog输出中看到的字符来自。如果您按照链接进行操作,您会发现0xc3确实映射到
字符,0xbc映射到
º
。显然,这是NSLog对C字符串的编码。

谢谢您的回复,但我的问题是,不仅NSLog显示错误的字符,而且当解析XML(使用TinyXML)并将数据保存到sqlite db(使用CoreData)时,错误的字符也会保存在那里

我知道这些字符是多字节序列,但我不明白为什么它在转换为cString时显然没有正确处理

不管怎样,现在我尝试调用[XMLData cStringWithEncoding:NSMacOSRomanStringEncoding],这就成功了——所以感谢您给我指明了方向

顺便问一下,您知道如何确定系统使用的编码吗?阅读参考资料时,我意识到编码取决于系统设置(语言、区域等)。我试图通过调用[NSString defaultCStringEncoding]来解决这个问题,但它返回nil。。。我想知道是否有一些一致的方法来处理各种编码的情况(下一次我可以面对东欧或其他任何情况)

再次感谢你,贝斯特

席子

Nürnberg
2009-08-12 23:55:53.077 try8[4980:813] Nürnberg