2010-12-29 20 views
7

Tengo una aplicación que lee los datos en formato UTF-8 del servidor, pero debe mostrarse en ISO 8859-1 (Latin-1). ¿Hay alguna API de Cocoa para lograr esto?Convertir la codificación UTF-8 a la codificación ISO 8859-1 con NSString

+2

"mostrar en ISO 8859-1" no tiene sentido. Si muestra texto, los personajes se dibujan. Y los caracteres son independientes de una codificación. La codificación se usa cuando el texto se almacena o transmite, pero no se visualiza. – Codo

+0

@ user543101 ¿Qué parte de mi respuesta no respondió lo suficiente a tu pregunta? –

+0

Estoy de acuerdo con Codo, esto no tiene sentido. Tomar caracteres codificados con ISO-8859-1 y simplemente serializarlos como UTF-8 solo está bien porque se incorporó ISO-8895-1 como los primeros 256 puntos de código, pero esto fallaría con cualquier otra codificación y podría fallar si no se está realmente usando ISO-8859-1 (por ejemplo, usando 8859-15 o Windows-1252). El servidor debería enviar los puntos de código Unicode codificados en UTF-8 y simplemente debería mostrar los glifos asociados. –

Respuesta

13

Puede utilizar NSString 's getCString:maxLength:encoding: método, como esto:

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

NSLog(@"%s", converted); 

Una vez que tenga esto, se puede volver a inicializar una instancia NSString de esa misma codificación utilizando el método stringWithCString:encoding: clase:

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

uso

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

Ejemplo:

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

Eso debería hacerlo.

+0

Esta función hace NSString desde el buffer de latin1 :) El autor pregunta acerca de la operación inversa. –

+0

@Evgen: esa función pide una cadena C 'yourCstringHere', y emite un NSSring con codificación latina, no desde un buffer latino como lo que has citado:" ... make NSString from Latin1 buffer :) "Thanks: -) –

+1

No es así. Su código indica que la cadena C está codificada en ISO-8859-1 y desea un NSString. Así que si tuviera la cadena "åhus" codificada como UTF-8, pero de latin-1 tendría un flujo de bytes como: C3 A5 68 75 73 y su método generaría el NSString: "Ã ¥ hus", lo cual es claramente incorrecto . –

0

Prefiero usar dataUsingEncoding:allowLossyConversion: porque no requiere que adivine la cantidad de almacenamiento que se va a asignar, y el NSData devuelto le dice cuántos bytes se requieren.

0

La respuesta de Jacobs realmente no funcionó para mi. Lo que eventualmente funcionó para mí fue usar

[username stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding] 
Cuestiones relacionadas