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
risposta
È 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];
uso
+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
Esempio:
latinStringForDisplay = [NSString stringWithCString:yourCstringHere encoding:NSISOLatin1StringEncoding];
Che dovrebbe farlo.
Questa funzione rende NSString dal buffer latin1 :) L'autore chiede l'operazione inversa. –
@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: -) –
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 . –
Preferisco usare dataUsingEncoding:allowLossyConversion:
perché non richiede di indovinare quanto spazio di archiviazione allocare e NSData restituito indica quanti byte sono stati richiesti.
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]
"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
@ user543101 Quale parte della mia risposta non ha risposto sufficientemente alla tua domanda? –
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. –