¿Cómo convierto entre ISO-8859-1 y UTF-8 en Java?

¿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 encoding ISO-8859-1. ¿Cómo hago esto?

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 transencoding 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.

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ı" 

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 encoding definitivamente no es el camino a seguir! Puede convertir una String en un byte[] y viceversa (dada una encoding). 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(); } 

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"; 

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())