当前位置:  开发笔记 > 编程语言 > 正文

NSLog编码错误

如何解决《NSLog编码错误》经验,为你挑选了1个好方法。

我遇到以下代码的问题:

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

在代码的第一行,两个汉字是双引号.问题是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);

Jason Coco.. 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]);

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



1> Jason Coco..:

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]);

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有