2011-10-22 16 views
15

Sto provando a leggere le stringhe da una matrice proveniente da un plist e stampare quelle stringhe.Conversione dei caratteri UTF8 fuoriusciti nella loro forma originale

Le stringhe nell'array contengono caratteri UTF8 con caratteri di escape, ad esempio "Nuša Florjančič" diventa "Nu\u0161a Florjan\u010di\u010d" quando viene letto dal plist. Non c'è modo di modificare il contenuto del plist, ma il mio programma deve visualizzare correttamente i nomi.

La cosa strana è che Objective-C sembra farlo automaticamente quando sto codificando la stringa. Tuttavia, se ottengo la stringa dal plist non succede nulla.

Per fare un esempio, ecco qualche codice:

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" - l'unica differenza è che è stata impostata tramite l'editor plist.

L'uscita della console è:

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 

Ho provato un sacco di cose, tra cui trasformare la stringa in un C-string e quindi la creazione di un oggetto NSString con una codifica UTF-8, ma niente ha funzionato a tutti.

Apprezzerei qualsiasi suggerimento da parte tua che potrebbe aiutarmi a risolvere questo problema apparentemente banale.

risposta

41

Sembra che la stringa nel plist contenga i caratteri "\ u0161" anziché il numero di carattere Unicode 0x161. Quindi devi decodificare gli \ u escape nella stringa che hai estratto dal plist. NSString può fare per voi utilizzando 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

Grazie mille, amico! Questo ha fatto il trucco :) – Tobi

+0

Grande pezzo di codice. Grazie. –

+0

@Tobi se questo ha funzionato, perché non puoi contrassegnarlo come risposta? – DroidHeaven

1

Altra soluzione è analizzare la stringa di lista (io ho usato per analizzare prima di costruirla)

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

(assomiglia croato, penso latin1 si adatta correttamente)

Problemi correlati