当我对某些unicode字符运行[NSString UTF8String]
时,生成的const char*
表示在NSLog
和设备/模拟器显示中都会受到损坏。 NSString
本身显示正常但我需要将NSString
转换为cStr
才能在CGContextShowTextAtPoint
中使用它。
重现起来很容易(见下面的代码),但我没有运气就搜索过类似的问题。必须是我缺少的基本东西。
const char *cStr = [@"章" UTF8String];
NSLog(@"%s", cStr);
谢谢!
答案 0 :(得分:2)
CGContextShowTextAtPoint
仅适用于ASCII字符。
检查this SO问题以获得答案。
答案 1 :(得分:1)
使用字符串格式说明符(也称为%s)时,如果不是ASCII,则无法保证c字符串的字符将正确打印。使用您定义的复杂字符可以使用转义字符以UTF-8表示,以指示可以从中找到字符的字符集。但是%s使用系统编码来解释您提供给格式的字符串中的字符(在本例中,在NSLog中)。请参阅Apple的文档:
%S 以空值终止的8位无符号字符数组。 %s以系统编码解释其输入,而不是例如UTF-8。
如果CGContextShowTextAtPoint不能正常工作,该API仅支持macRoman字符集,而不是整个Unicode字符集。
您需要查看另一个用于显示Unicode字符的API。可能是你想要开始的核心文本。
答案 2 :(得分:1)
之前我从未注意过这个问题,但是一些快速实验表明,使用printf
代替NSLog
会导致显示正确的Unicode字符。
尝试:
printf("%s", cStr);
这为我提供了Xcode控制台和终端中所需的输出(“章”)。正如nob1984在他的回答中所说,字符数据的解释取决于被调用者。