Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用Unicode字符的iOS NSLog错误_Objective C_Ios_Unicode_Nsstring_Nslog - Fatal编程技术网

Objective c 使用Unicode字符的iOS NSLog错误

Objective c 使用Unicode字符的iOS NSLog错误,objective-c,ios,unicode,nsstring,nslog,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\U0

有人能告诉我以下结果不一致的原因吗

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"
)
结果

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 
2012-09-14 13:08:23.493ΑΜ[1390:c07]∧εΩόρθρΚύπρο163,16451Αρρρροπολη962;,λλλλλάς+/-100.00m,区域(标识符半径141.62)半径141.62m
谢谢

有意思:)

%@
传递到
NSLog
的格式字符串只意味着“调用对象上的
描述”

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


但是,我怀疑
NSArray
上的description方法只调用它包含的每个对象的description,然后,出于某种原因,我不是100%确定,在将它们转储到
NSLog
之前对它们进行编码,将
%@
传递到
NSLog
确实调用了
[NSArray description]
在阵列上。表示
[NSArray description]
“返回表示数组内容的字符串,格式为属性列表”。这样做会将unicode字符转换为
nsnonlossysistringencoding
。如果您反转此过程,您的NSArray将正确打印

completionHandler:^(NSArray *placemarks, NSError *error) {
       NSLog(@"%@", [NSString stringWithCString:[[placemarks description] cStringUsingEncoding:NSASCIIStringEncoding] encoding:NSNonLossyASCIIStringEncoding]);
其工作原理是将包含所有\uxxx编码通用字符的原始字符串转换为c字符串,然后将c字符串解码为
NSString
反转
nsnonlossysistringencoding
,这是由
[NSLog description]
完成的。我还没有找到一种不首先转换成c字符串的方法

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