2012-01-13 19 views
7

Soy nuevo en Objective-C y trato de convertir un NSString codificado en UTF8 malformado en uno bien formado utilizando el ejemplo en apples docs.Decodificación UTF8 con NSString

NSString *theString = @"Lügen"; //should be "ü" 
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding]; 

NSLog(@"Original: %@ (length %d)", theString, [theString length]); 
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]); 

Resultado:

Original: Lügen (length 6) 
Converted: LA1/4gen (length 8) 

Esto aquí es no hacer nada:

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSASCIIStringEncoding]]; 

Esto aquí se estrella mi aplicación

NSString* str = [NSString stringWithUTF8String: 
       [theString cStringUsingEncoding:NSUTF8StringEncoding]]; 

Alguien alguna idea de lo que estoy haciendo mal?

+0

¿Podría volcar las cadenas como hex? No leo UTF8 mal formado con fluidez :) –

+0

esto es un "ü" no sé cómo obtener el valor hexadecimal;) –

+0

Por favor, publique los detalles de la falla en cualquier pregunta que involucre un bloqueo. – jrturton

Respuesta

14
NSString *string = @"ü"; 
const char *c = [string cStringUsingEncoding:NSISOLatin1StringEncoding]; 
NSString *newString = [[NSString alloc]initWithCString:c encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",newString); // ü 

"Secuencia UTF-8 mal formada" hace referencia a una secuencia de bytes que no son válidos en UTF-8. Su problema son los resultados inesperados después de analizar una cadena con una codificación diferente a la utilizada por el autor original de la cadena.

datos hexadecimales C3 BCanalizados con codificación UTF-8 es el carácter ü. En su lugar, utilizó la codificación Latin-1, que da como resultado ü. Luego creó un NSString a partir de la cadena analizada Latin-1, lo que significa que convirtió la cadena Latin-1 en una cadena UTF-16 (que es el formato nativo de NSString).

La representación de un dato dado en diferentes codificaciones aparece como diferentes caracteres, pero no cambia los datos. La conversión a una codificación diferente cambia los datos en un intento de reproducir los mismos caracteres. Ejemplo: el carácter ü es C3 83 C2 BC en UTF-8, pero C3 BC en Latin-1. Así que me convertí a los mismos caracteres en Latin-1 para obtener los datos originales, y luego los analicé como UTF-8.

+0

muchas gracias :) –