NSString UTF8String mangling unicode characters



当我对某些 unicode 字符运行[NSString UTF8String]时,生成的const char*表示形式在NSLog和设备/模拟器显示器上都会被破坏。NSString本身显示正常,但我需要将NSString转换为cStr才能在CGContextShowTextAtPoint中使用它。

它很容易重现(见下面的代码(,但我搜索了类似的问题,没有任何运气。一定是我缺少的基本东西。

const char *cStr = [@"章" UTF8String];
NSLog(@"%s", cStr); 

谢谢!

CGContextShowTextAtPoint仅适用于 ASCII 字符。

检查此SO问题以获取答案。

使用字符串格式说明符(又名 %s(时,如果 c 字符串的字符不是 ASCII,则无法保证它们将正确打印。 使用您定义的复杂字符可以用 UTF-8 表示,使用转义字符来指示可以从中找到该字符的字符集。 但是,%s 使用系统编码来解释您提供给格式的字符串中的字符(在本例中为 NSLog (。 请参阅苹果的文档:

https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

%s以 8 位无符号字符为前缀的 null 数组。%s 在系统编码中解释其输入,而不是例如 UTF-8。

继续你CGContextShowTextAtPoint不起作用,该API仅支持macRoman字符集,这不是整个Unicode字符集。

您需要查看另一个用于显示 Unicode 字符的 API。 核心文本可能是您想要开始的地方。

我以前从未注意到这个问题,但一些快速实验表明,使用 printf 而不是 NSLog 会导致显示正确的 Unicode 字符。

尝试:

printf("%s", cStr);

这在 Xcode 控制台和终端中都为我提供了所需的输出("章"(。正如nob1984在他的回答中所说,字符数据的解释取决于被调用者。

最新更新