NSLog编码错误

时间:2009-04-06 01:54:02

标签: objective-c

我遇到以下代码的问题:

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

4 个答案:

答案 0 :(得分: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 :(得分:4)

我的猜测是NSLog假定8位C字符串的编码与UTF-8不同,它可能是不支持中文字符的编码。虽然很尴尬,但你可以试试这个:

NSLog(@"%@", [NSString stringWithCString: temp encoding: NSUTF8StringEncoding]);

答案 2 :(得分:2)

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

但这就是你现在可以做的解决问题的方法:

NSLog(@"%@", strValue);

答案 3 :(得分:-1)

    #   define NSLogUTF8(a,b) NSLog(a,[NSString stringWithCString:[[NSString stringWithFormat:@"%@",b] cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding])

#define NSLogUTF8Ex(a,b) NSLog(a,[MLTool utf8toNString:[NSString stringWithFormat:@"%@",b]])

+(NSString*)utf8toNString:(NSString*)str{
    NSString* strT= [str stringByReplacingOccurrencesOfString:@"\\U" withString:@"\\u"];
    //NSString *strT = [strTemp mutableCopy];
    CFStringRef transform = CFSTR("Any-Hex/Java");
    CFStringTransform((__bridge CFMutableStringRef)strT, NULL, transform, YES);

    return strT;
}