convertir - ¿Cómo convierto entre ISO-8859-1 y UTF-8 en Java?
convertir string a utf 8 java (5)
¿Alguien sabe cómo convertir una cadena de ISO-8859-1 a UTF-8 y viceversa en Java?
Obtengo una cadena de la web y la guardo en el RMS (J2ME), pero quiero conservar los caracteres especiales y obtener la cadena del RMS pero con la codificación ISO-8859-1. ¿Cómo hago esto?
Aquí hay una manera fácil con String output (creé un método para hacer esto):
public static String (String input){
String output = "";
try {
/* From ISO-8859-1 to UTF-8 */
output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
/* From UTF-8 to ISO-8859-1 */
output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return output;
}
// Example
input = "Música";
output = "Música";
En general, no puedes hacer esto. UTF-8 es capaz de codificar cualquier punto de código Unicode. ISO-8859-1 solo puede manejar una pequeña fracción de ellos. Por lo tanto, la transcodificación de ISO-8859-1 a UTF-8 no es un problema. Retroceder de UTF-8 a ISO-8859-1 hará que aparezcan "caracteres de reemplazo" ( ) en el texto cuando se encuentren caracteres no admitidos.
Para transcodificar texto:
byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");
o
byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");
Puede ejercer más control utilizando las API de Charset
nivel Charset
. Por ejemplo, puede generar una excepción cuando se encuentre un carácter no codificable o utilizar un carácter diferente para reemplazar el texto.
Si tienes un String
, puedes hacer eso:
String s = "test";
try {
s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
Si tienes un String
''roto'', hiciste algo mal, ¡convertir un String
en un String
en otra codificación definitivamente no es el camino a seguir! Puede convertir una String
en un byte[]
y viceversa (dada una codificación). En Java String
s están codificadas con AFAIK con UTF-16
pero eso es un detalle de implementación.
Supongamos que tiene un InputStream
, puede leer en un byte[]
y luego convertirlo en una String
usando
byte[] bs = ...;
String s;
try {
s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
o incluso mejor (gracias a Erickson) usa InputStreamReader
así:
InputStreamReader isr;
try {
isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
La clase de Conjuntos IO de Apache Commons puede ser útil:
String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
Lo cual funcionó para mí: ("üzüm bağları" es el correcto escrito en turco)
Convierte ISO-8859-1 a UTF-8:
String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"
Convierte UTF-8 a ISO-8859-1
String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"