NSString UTF8String修改unicode字符

时间:2012-05-06 06:31:25

标签: iphone objective-c ios

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

重现起来很容易(见下面的代码),但我没有运气就搜索过类似的问题。必须是我缺少的基本东西。

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

谢谢!

3 个答案:

答案 0 :(得分:2)

CGContextShowTextAtPoint仅适用于ASCII字符。

检查this SO问题以获得答案。

答案 1 :(得分:1)

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

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

%S 以空值终止的8位无符号字符数组。 %s以系统编码解释其输入,而不是例如UTF-8。

如果CGContextShowTextAtPoint不能正常工作,该API仅支持macRoman字符集,而不是整个Unicode字符集。

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

答案 2 :(得分:1)

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

尝试:

printf("%s", cStr);

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