Come posso convertire tra ISO-8859-1 e UTF-8 in Java?

Qualcuno sa come convertire una stringa da ISO-8859-1 a UTF-8 e di nuovo in Java?

Sto ottenendo una stringa dal web e salvandola in RMS (J2ME), ma voglio conservare i caratteri speciali e ottenere la stringa da RMS ma con la codifica ISO-8859-1. Come faccio a fare questo?

In generale, non puoi farlo. UTF-8 è in grado di codificare qualsiasi punto di codice Unicode. ISO-8859-1 può gestire solo una piccola parte di essi. Quindi, la transcodifica da ISO-8859-1 a UTF-8 non è un problema. Andando indietro da UTF-8 a ISO-8859-1, i caratteri “sostitutivi” ( ) compaiono nel testo quando vengono trovati caratteri non supportati.

Per transcodificare il testo:

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

Puoi esercitare un maggiore controllo utilizzando le API Charset livello inferiore. Ad esempio, puoi sollevare un’eccezione quando viene trovato un personaggio non codificabile o utilizzare un carattere diverso per il testo sostitutivo.

Che ha funzionato per me: (“üzüm bağları” è la scritta corretta in turco)

Converti ISO-8859-1 in 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ı" 

Convertire UTF-8 in 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ı" 

Se hai una String , puoi farlo:

 String s = "test"; try { s.getBytes("UTF-8"); } catch(UnsupportedEncodingException uee) { uee.printStackTrace(); } 

Se hai una String “rotta”, hai fatto qualcosa di sbagliato, la conversione di una String in una String in un’altra codifica non è assolutamente la strada da percorrere! È ansible convertire una String in un byte[] e viceversa (data una codifica). In Java String s sono codificati AFAIK con UTF-16 ma questo è un dettaglio di implementazione.

Supponiamo che tu abbia un InputStream , puoi leggere in un byte[] e poi convertirlo in String usando

 byte[] bs = ...; String s; try { s = new String(bs, encoding); } catch(UnsupportedEncodingException uee) { uee.printStackTrace(); } 

o ancora meglio (grazie a erickson) usa InputStreamReader questo modo:

 InputStreamReader isr; try { isr = new InputStreamReader(inputStream, encoding); } catch(UnsupportedEncodingException uee) { uee.printStackTrace(); } 

Ecco un modo semplice con l’output String (ho creato un metodo per farlo):

 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 class Charsets di Apache Commons IO può tornare utile:

 String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())