带有Unicode字符的iOS 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 

谢谢

有趣的:)

%@传递给NSLog的格式string就意味着“调用对象的description ”。

它看起来像NSArray处理unicode字符description不同于每个对象的description

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

%@传给NSLog确实会调用数组上的[NSArray description] 。 NSArray类引用说[NSArray description] “返回一个string,表示数组的内容,格式化为属性列表”。 这样做将unicode字符转换为NSNonLossyASCIIStringEncoding 。 如果您逆转过程,您的NSArray将正确打印。

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

这是通过将所有的\ Uxxxx编码的通用字符转换为acstring,然后将cstring解码为一个反转NSNonLossyASCIIStringEncodingNSString来完成的[NSLog description] 。 我还没有想出一个方法来做到这一点,而不先转换为ACstring。