2012-01-13 16 views
7

Sono nuovo in Objective-C e provo a convertire un NSString codificato UTF8 non valido in uno wellformed utilizzando l'esempio su apples docs.UTF8 Decodifica 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]); 

Risultato:

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

Questo qui sta facendo nulla:

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

Questo qui si blocca la mia app

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

Chiunque idea di cosa sto facendo male?

+0

Potresti scaricare le stringhe come esadecimale? Non leggo fluentemente UTF8 malformato :) –

+0

questo è un "ü" non so come ottenere il valore esadecimale;) –

+0

Si prega di postare dettagli del crash in qualsiasi domanda che coinvolge un crash. – jrturton

risposta

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

"Sequenza UTF-8 non valida" indica una sequenza di byte non valida in UTF-8. Il tuo problema è un risultato inaspettato dopo aver analizzato una stringa con una codifica diversa da quella usata dall'autore originale della stringa.

dati esadecimali C3 BCanalizzati con codifica UTF-8 è caratteri ü. Invece hai usato la codifica Latin-1, che risulta in ü. Quindi hai creato una NSString dalla stringa analizzata in Latin-1, il che significa che lo ha convertito la stringa Latin-1 in una stringa UTF-16 (che è il formato nativo di NSString).

La rappresentazione di un dato dato in diverse codifiche si presenta come caratteri diversi, ma non modifica i dati. La conversione in una codifica diversa modifica i dati nel tentativo di riprodurre gli stessi caratteri. Esempio: il carattere ü è C3 83 C2 BC in UTF-8, ma C3 BC in Latin-1. Così ho convertito gli stessi caratteri in Latin-1 per ottenere i dati originali, e poi ho analizzato come UTF-8.

+0

grazie mille :) –