2012-09-14 14 views
5

Czy ktoś może mi podać przyczynę rozbieżności dla następujących wyników?Błąd NSLog w iOS ze znakami Unicode

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

wynikające z:

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

i

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

Wynikające

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 

Dziękuję

Odpowiedz

6

Interesujące :)

Przekazanie %@ do ciągu formatu NSLog oznacza "zadzwoń pod numer description".

Wygląda na to, że description na NSArray traktuje znaki Unicode inaczej niż description na każdym obiekcie.

Podejrzewam jednak, że opis opisów na każdym z obiektów, które zawiera, a następnie, z jakiegoś powodu nie jestem w 100% pewny, koduje je przed wyrzuceniem ich do NSLog.

3

Przekazywanie %@ do NSLog wywołuje [NSArray description] w tablicy. NSArray class reference mówi, że [NSArray description] "zwraca ciąg reprezentujący zawartość tablicy, sformatowany jako lista właściwości". W ten sposób konwertuje znaki Unicode na NSNonLossyASCIIStringEncoding. NSArray wydrukuje się prawidłowo, jeśli odwrócisz ten proces.

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

Działa to przez przekształcenie pierwotnego łańcucha ze wszystkimi \ uXXXX zakodowanych znaków uniwersalnych do łańcucha C, następnie dekodowanie znaków c do NSString odwrócenie NSNonLossyASCIIStringEncoding, które zostały wykonane przez [NSLog description]. Nie znalazłem sposobu, aby to zrobić bez wcześniejszej konwersji na ciąg znaków c.

Powiązane problemy