2012-09-14 14 views
5

¿Alguien me puede decir la causa de la discrepancia para los siguientes resultados?iOS NSLog error con caracteres Unicode

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

resultante:

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

y

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

resultante

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 

Gracias

Respuesta

6

Interesante :)

Pasando %@ en NSLog 's de cadena de formato solo significa' llame al description en un objeto '.

Parece que description en NSArray trata con caracteres Unicode de manera diferente que description en cada objeto.

Sin embargo, sospecho que el método de descripción en NSArray solo llama a descripción en cada uno de los objetos que contiene y luego, por algún motivo no estoy 100% seguro, los codifica antes de eliminarlos a NSLog.

3

Pasando %@ a NSLog llama al [NSArray description] en la matriz. NSArray class reference dice que [NSArray description] "devuelve una cadena que representa el contenido de la matriz, formateada como una lista de propiedades". Al hacerlo, convierte caracteres Unicode en NSNonLossyASCIIStringEncoding. Su NSArray se imprimirá correctamente si invierte el proceso.

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

Esto funciona mediante la conversión de la cadena original con todos los caracteres universales \ Uxxxx codificados en una cadena c, entonces la decodificación de la secuencia de c NSString a una inversión de la NSNonLossyASCIIStringEncoding que había sido hecho por el [NSLog description]. No he encontrado una manera de hacer esto sin primero convertirme en una cadena c.

Cuestiones relacionadas