NSLog编码错误

Jia*_*ang 12 objective-c

我遇到以下代码的问题:

NSString *strValue=@"??";
char temp[200];
strcpy(temp, [strValue UTF8String]);
printf("%s", temp);
NSLog(@"%s", temp);
Run Code Online (Sandbox Code Playgroud)

在代码的第一行,两个汉字是双引号.问题是printf函数可以正确显示汉字,但NSLog不能.


谢谢大家.我找到了解决这个问题的方法.基金会默认使用UTF-16,所以为了在示例中使用NSLog输出c字符串,我必须使用cStringUsingEncoding来获取UTF-16 c字符串并使用%S来替换%s.

NSString *strValue=@"??";
char temp[200];
strcpy(temp, [strValue UTF8String]);
printf("%s", temp);
strcpy(temp, [strValue cStringUsingEncoding:NSUTF16LittleEndianStringEncoding]);
NSLog(@"%S", temp);
Run Code Online (Sandbox Code Playgroud)

Jas*_*oco 10

NSLog的%s格式说明符采用系统编码,似乎始终是MacRoman而不是unicode,因此它只能以MacRoman编码显示字符.使用NSLog的最佳选择就是使用本机对象格式说明符%@并直接传递NSString,而不是将其转换为C String.如果你只有一个C字符串并且想要使用NSLog来显示消息而不是printf或asl,那么你必须做一些像Don建议的事情,以便首先将字符串转换为NSString对象.

所以,所有这些应该显示预期的字符串:

NSString *str = @"??";
const char *cstr = [str UTF8String];
NSLog(@"%@", str);
printf("%s\n", cstr);
NSLog(@"%@", [NSString stringWithUTF8String:cstr]);
Run Code Online (Sandbox Code Playgroud)

如果您决定使用asl,请注意虽然它接受UTF8格式的字符串并将正确的编码传递给syslog守护程序(因此它将在控制台中正确显示),但它在显示到终端时对可视编码的字符串进行编码或者记录到文件句柄,因此非ASCII值将显示为转义字符序列.


Pab*_*ruz 2

我知道您可能正在寻找一个可以帮助您了解正在发生的事情的答案。

但这是您现在可以采取的措施来解决您的问题:

NSLog(@"%@", strValue);
Run Code Online (Sandbox Code Playgroud)