2

当我[NSString UTF8String]在某些 unicode 字符上运行时,结果const char*表示会NSLog在设备/模拟器显示器中和设备/模拟器显示器上被破坏。本身显示正常,NSString但我需要将其转换NSString为 acStr才能在CGContextShowTextAtPoint.

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

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

谢谢!

4

3 回答 3

2

CGContextShowTextAtPoint仅适用于 ASCII 字符。

检查这个SO question 以获得答案。

于 2012-05-06T06:52:26.627 回答
1

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

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

%s 以 Null 结尾的 8 位无符号字符数组。%s 以系统编码而非 UTF-8 等方式解释其输入。

转到您的 CGContextShowTextAtPoint 不起作用,该 API 仅支持 macRoman 字符集,而不是整个 Unicode 字符集。

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

于 2012-05-06T06:50:16.820 回答
1

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

尝试:

printf("%s", cStr);

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

于 2012-05-06T06:50:46.810 回答