Convirtiendo los caracteres escapados UTF8 a su forma original

Estoy tratando de leer cadenas de una matriz que proviene de un plist e imprimir esas cadenas.

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

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

Para darle 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 configurado 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, incluida la transformación de la cadena en una cadena C y luego la creación de un objeto NSString con encoding UTF-8, pero nada funcionó en absoluto.

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

Suena como si 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 usando NSNonLossyASCIIStringEncoding :

 #import  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; } 

Otra solución es analizar su cadena de lista (solía analizarla antes de comstackrla)

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

(Parece croata, creo que latin1 encajará correctamente)