2010-12-29 5 views
7

Ho un'applicazione che legge i dati in formato UTF-8 dal server, ma deve essere visualizzata in ISO 8859-1 (Latin-1). Ci sono delle API Cocoa per raggiungere questo obiettivo?Convertire la codifica UTF-8 in codifica ISO 8859-1 con NSString

+2

"display in ISO 8859-1" non ha senso. Se visualizzi del testo, i caratteri sono disegnati. E i personaggi sono indipendenti da una codifica. La codifica viene utilizzata quando il testo viene memorizzato o trasmesso, ma non sul display. – Codo

+0

@ user543101 Quale parte della mia risposta non ha risposto sufficientemente alla tua domanda? –

+0

Sono d'accordo con Codo, questo non ha senso. Prendendo i caratteri codificati ISO-8859-1 e semplicemente serializzandoli come UTF-8 è ok solo perché ISO-8895-1 è stato incorporato come i primi 256 codepoint, ma questo fallirebbe con qualsiasi altra codifica e potrebbe fallire se non si è effettivamente utilizzando ISO-8859-1 (ad esempio, utilizzando 8859-15 o Windows-1252). Il server dovrebbe inviare i codepoint Unicode codificati in UTF-8 e dovresti semplicemente visualizzare i glifi associati. –

risposta

13

È possibile utilizzare NSString s' getCString:maxLength:encoding: metodo, in questo modo:

char converted[([string length] + 1)]; 
[string getCString:converted maxLength:([string length] + 1) encoding: NSISOLatin1StringEncoding]; 

NSLog(@"%s", converted); 

Una volta fatto questo, si può quindi ri-inizializzare un'istanza NSString da quella stessa codifica utilizzando il metodo stringWithCString:encoding: classe:

NSString *converted_str = [NSString stringWithCString:converted encoding:NSISOLatin1StringEncoding]; 
-1

uso

+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc 

Esempio:

latinStringForDisplay = [NSString stringWithCString:yourCstringHere encoding:NSISOLatin1StringEncoding]; 

Che dovrebbe farlo.

+0

Questa funzione rende NSString dal buffer latin1 :) L'autore chiede l'operazione inversa. –

+0

@Evgen: Quella funzione richiede una stringa C 'yourCstringHere', e genera un NSSring con la codifica latina, non da un buffer latin come quello che hai citato in:" ... make NSString dal buffer latin1 :) "Grazie: -) –

+1

Non lo fa. Il tuo codice dice che la stringa C è codificata in ISO-8859-1 e vuoi una NSString. Quindi se avesse la stringa "åhus" codificata come UTF-8 ma da latin-1 avrebbe un flusso di byte come: C3 A5 68 75 73 e il tuo metodo genererebbe la NSString: "Ã ¥ hus" che è chiaramente sbagliato . –

0

Preferisco usare dataUsingEncoding:allowLossyConversion: perché non richiede di indovinare quanto spazio di archiviazione allocare e NSData restituito indica quanti byte sono stati richiesti.

0

La risposta di Jacobs non ha funzionato davvero per il mio. Quello che alla fine ha funzionato per me era usare solo

[username stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding]