2011-10-22 29 views
15

Estoy tratando de leer cadenas de una matriz que proviene de un plist e imprimir esas cadenas.Conversión de caracteres UTF8 escapados a su forma original

Las cadenas en la matriz contienen caracteres UTF8 escapados; por ejemplo, "Nuša Florjančič" pasa a "Nu\u0161a Florjan\u010di\u010d" cuando se lee desde la lista. No hay forma de cambiar el contenido del plist, pero mi programa necesita mostrar los nombres correctamente.

Lo extraño es que Objective-C parece hacer esto automáticamente cuando estoy hardcoding la cadena. Sin embargo, si obtengo la cadena del plist, no pasa nada.

Para dar un ejemplo, aquí hay un código:

NSString *name1 = @"Nu\u0161a Florjan\u010di\u010d"; 
NSString *name2 = [list objectAtIndex:0];  
NSLog(@"name 1: %@", name1); 
NSLog(@"name 2: %@", name2); 

[list objectAtIndex:0] contiene @"Nu\u0161a Florjan\u010di\u010d" - la única diferencia es que se ha establecido a través del editor plist.

La salida de la consola es:

2011-10-22 18:00:02.595 Test[13410:11c03] name 1: Nuša Florjančič 
2011-10-22 18:00:02.595 Test[13410:11c03] name 2: Nu\u0161a Florjan\u010di\u010d 

He intentado todo tipo de cosas, incluyendo la transformación de la cadena en una cadena tipo C y luego la creación de un objeto NSString con una codificación UTF-8, pero nada funcionó en todas.

Realmente apreciaría cualquier sugerencia suya que pueda ayudarme a resolver este problema aparentemente mundano.

Respuesta

41

Parece que la cadena en el plist contiene los caracteres "\ u0161" en lugar del número de carácter Unicode 0x161. Entonces necesitas decodificar el \ u escapes en la cadena que has extraído del plist. NSString puede hacer eso por usted, utilizando NSNonLossyASCIIStringEncoding:

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     NSString *name2escaped = @"Nu\\u0161a Florjan\\u010di\\u010d"; 
     NSString *name2 = [NSString 
      stringWithCString:[name2escaped cStringUsingEncoding:NSUTF8StringEncoding] 
      encoding:NSNonLossyASCIIStringEncoding]; 
     NSLog(@"name2 = %@", name2); 
    } 
    return 0; 
} 
+0

Muchas gracias, amigo! Eso hizo el truco :) – Tobi

+0

Gran pedazo de código. Gracias. –

+0

@Tobi si eso funcionó, ¿por qué no puedes marcarlo como respuesta? – DroidHeaven

1

Otra solución es analizar la cadena de la lista (he usado para analizar antes de construirlo)

NSString yourFinalString = [NSString stringWithCString:[yourOriginalString cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding]; 

(se parece a Croacia, creo latin1 encajarán correctamente)

Cuestiones relacionadas