繁体   English   中英

NSString UTF8String改写unicode字符

[英]NSString UTF8String mangling unicode characters

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

复制非常容易(请参见下面的代码),但是我一直在寻找类似的问题,但没有任何运气。 一定是我所缺少的基本知识。

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

谢谢!

CGContextShowTextAtPoint仅适用于ASCII字符。

检查 SO问题以获取答案。

使用字符串格式说明符(也称为%s)时,如果不是ASCII,则不能保证ac字符串的字符将正确打印。 可以在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。 您可能想从Core Text开始。

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

尝试:

printf("%s", cStr);

这在Xcode控制台和Terminal中都为我提供了所需的输出(“章”)。 正如nob1984在他的回答中所指出的那样,字符数据的解释取决于被呼叫者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM