2012-09-14 10 views
5

Kann mir jemand die Ursache der Diskrepanz für die folgenden Ergebnisse sagen?iOS NSLog Fehler mit Unicode-Zeichen

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

resultierende:

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

und

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

Resultierende

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 

Danke

Antwort

6

Interessant :)

Übergeben %@ in NSLog 's Formatzeichenkette bedeutet nur "Anruf description auf einem Objekt".

Es sieht aus wie description auf NSArray befasst sich mit Unicode-Zeichen anders als die description auf jedem Objekt.

Allerdings vermute ich, dass die Beschreibung Methode auf NSArray ruft nur Beschreibung auf jedes der Objekte, die es enthält, und dann, aus irgendeinem Grund bin ich nicht 100% sicher über, codiert sie vor dem Auslagern sie auf NSLog.

3

Übergeben %@ zu NSLog ruft die [NSArray description] auf dem Array. NSArray class reference sagt, dass [NSArray description] "eine Zeichenfolge zurückgibt, die den Inhalt des Arrays darstellt, formatiert als eine Eigenschaftsliste". Dadurch werden Unicode-Zeichen in NSNonLossyASCIIStringEncoding konvertiert. Ihr NSArray wird korrekt gedruckt, wenn Sie den Prozess umkehren.

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

Dies funktioniert, indem mit all den \ Uxxxx codierten universellen Zeichen in eine c-Schnur die ursprüngliche Zeichenfolge konvertieren, dann Dekodieren der c-Schnur mit einem NSString die NSNonLossyASCIIStringEncoding Umkehr, die von der [NSLog description] getan worden war. Ich habe keinen Weg gefunden, dies zu tun, ohne zuerst in eine c-Zeichenfolge umgewandelt zu werden.