带有Unicode字符的iOS NSLog错误

时间:2012-09-14 10:22:10

标签: objective-c ios unicode nsstring nslog

有人能告诉我以下结果的差异原因吗?

completionHandler:^(NSArray *placemarks, NSError *error) {
    NSLog(@"\n placemarks%@", placemarks);

由于:

placemarks(
"\U039b\U03b5\U03c9\U03c6\U03cc\U03c1\U03bf\U03c2 \U039a\U03cd\U03c0\U03c1\U03bf\U03c5 163, 16451 \U0391\U03c1\U03b3\U03c5\U03c1\U03bf\U03cd\U03c0\U03bf\U03bb\U03b7\U03c2, \U0395\U03bb\U03bb\U03ac\U03c2 @ <+37.90085408,+23.75654648> +/- 100.00m, region (identifier <+37.90085408,+23.75654648> radius 141.62) <+37.90085408,+23.75654648> radius 141.62m"
)

for(id object in placemarks ) {NSLog(@"%@ \n", object);}

所得

2012-09-14 13:08:23.493 ΑΦΜ[1390:c07] Λεωφόρος Κύπρου 163, 16451 Αργυρούπολης, Ελλάς @ <+37.90085408,+23.75654648> +/- 100.00m, region (identifier <+37.90085408,+23.75654648> radius 141.62) <+37.90085408,+23.75654648> radius 141.62m 

谢谢

2 个答案:

答案 0 :(得分:6)

有趣:)

%@传递到NSLog的格式字符串只是意味着'在对象上调用description

description NSArray上的description处理unicode字符的方式与每个对象上NSArray的处理方式不同。

但是,我怀疑NSLog上的描述方法只调用它包含的每个对象的描述然后由于某种原因我不是100%肯定,在将它们转储到之前对它们进行编码{{1}}。

答案 1 :(得分:3)

%@传递给NSLog会调用阵列上的[NSArray description]NSArray class reference表示[NSArray description]&#34;返回一个表示数组内容的字符串,格式为属性列表&#34;。这样做会将unicode字符转换为NSNonLossyASCIIStringEncoding。如果您颠倒过程,NSArray将正确打印。

completionHandler:^(NSArray *placemarks, NSError *error) {
       NSLog(@"%@", [NSString stringWithCString:[[placemarks description] cStringUsingEncoding:NSASCIIStringEncoding] encoding:NSNonLossyASCIIStringEncoding]);

这可以通过将原始字符串与所有\ Uxxxx编码的通用字符转换为ac字符串,然后将c字符串解码为NSString来反转由{{NSNonLossyASCIIStringEncoding完成的[NSLog description] 1}}。如果没有先转换为c字符串,我还没有想出办法。