我遇到以下代码的问题:
NSString *strValue=@"??"; char temp[200]; strcpy(temp, [strValue UTF8String]); printf("%s", temp); NSLog(@"%s", temp);
在代码的第一行,两个汉字是双引号.问题是printf函数可以正确显示汉字,但NSLog不能.
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值将显示为转义字符序列.
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值将显示为转义字符序列.