5

次の結果の不一致の原因を誰か教えてもらえますか?

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 

ありがとうございました

4

2 に答える 2

6

面白い :)

のフォーマット文字列に渡す%@ことは、単に「オブジェクトの呼び出し」を意味します。NSLogdescription

on は、各オブジェクトの とは異なる方法で Unicode 文字を処理しているようdescriptionに見えます。NSArraydescription

ただし、説明メソッドNSArrayは、そこに含まれる各オブジェクトの説明を呼び出​​すだけで、何らかの理由で100%確信が持てないため、それらをにダンプする前にエンコードしていると思われNSLogます。

于 2012-09-14T10:44:15.283 に答える
3

に渡す%@と、配列NSLogの が呼び出されます。NSArray クラス リファレンスには、「プロパティ リストとしてフォーマットされた、配列の内容を表す文字列を返す」と記載されています。そうすることで、Unicode 文字が に変換されます。プロセスを逆にすると、NSArray は正しく印刷されます。[NSArray description][NSArray description]NSNonLossyASCIIStringEncoding

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

これは、\Uxxxx でエンコードされたすべてのユニバーサル文字を含む元の文字列を ac 文字列に変換し、次に c 文字NSStringNSNonLossyASCIIStringEncoding[NSLog description]. 最初にac文字列に変換せずにこれを行う方法を見つけていません。

于 2014-05-30T17:27:36.047 に答える