2012-09-14 35 views
5

任何人都可以告訴我以下結果的差異原因嗎?帶有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 

謝謝

回答

6

有趣:)

%@傳遞給NSLog的格式字符串只是表示'在對象上調用description'。

它看起來像descriptionNSArray處理與每個對象上的description不同的Unicode字符。

但是,我懷疑NSArray上的描述方法只是調用它包含的每個對象的描述,然後出於某種原因,我不是100%確定的,在將它們轉儲到NSLog之前進行編碼。

3

通過%@NSLog確實調用陣列上的[NSArray description]NSArray class reference表示[NSArray description]「返回表示數組內容的字符串,格式爲屬性列表」。這樣做將unicode字符轉換爲NSNonLossyASCIIStringEncoding。如果逆轉過程,您的NSArray將正確打印。

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

此作品由C字符串原字符串與所有爲\ uXXXX編碼的通用字符轉換成C字符串,然後解碼成NSString扭轉其已被[NSLog description]完成NSNonLossyASCIIStringEncoding。如果不先轉換爲c字符串,我還沒有想出辦法做到這一點。

相關問題