我注意到,如果我尝试使用格式说明符“%s”打印包含 UTF-8 字符串表示形式的字节数组,printf()
说得对,但是NSLog()
得到它乱码(即,每个字节按原样打印,因此例如“¥”被打印为2个字符:“Ø•”)。
这很奇怪,因为我一直认为NSLog()
只是printf()
, plus:
- 第一个参数(“格式”)是 Objective-C 字符串,而不是 C
字符串(因此是“@”)。
- 时间戳和应用程序名称前置。
- 换行符自动添加在末尾。
- 打印 Objective-C 对象的能力(使用格式“%@”)。
My code:
NSString* string;
// (...fill string with unicode string...)
const char* stringBytes = [string cStringUsingEncoding:NSUTF8Encoding];
NSUInteger stringByteLength = [string lengthOfBytesUsingEncoding:NSUTF8Encoding];
stringByteLength += 1; // add room for '\0' terminator
char* buffer = calloc(sizeof(char), stringByteLength);
memcpy(buffer, stringBytes, stringByteLength);
NSLog(@"Buffer after copy: %s", buffer);
// (renders ascii, no matter what)
printf("Buffer after copy: %s\n", buffer);
// (renders correctly, e.g. japanese text)
不知何故,看起来好像printf()
比“更聪明”NSLog()
。有谁知道根本原因,以及此功能是否在任何地方都有记录? (找不到)
NSLog()
and stringWithFormat:
似乎期望字符串%s
在“系统编码”中(例如我的计算机上的“Mac Roman”):
NSString *string = @"¥";
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(CFStringGetSystemEncoding());
const char* stringBytes = [string cStringUsingEncoding:enc];
NSString *log = [NSString stringWithFormat:@"%s", stringBytes];
NSLog(@"%@", log);
// Output: ¥
当然,如果某些字符在系统编码中无法表示,这将会失败。我找不到这种行为的官方文档,但可以看到使用%s
in stringWithFormat:
or NSLog()
不能可靠地处理任意 UTF-8 字符串。
如果您想检查 a 的内容char
包含 UTF-8 字符串的缓冲区,然后
这适用于任意字符(使用盒装表达式语法来创建NSString
来自 UTF-8 字符串):
NSLog(@"%@", @(utf8Buffer));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)