web-dev-qa-db-fra.com

Comment convertir entre ISO-8859-1 et UTF-8 en Java?

Est-ce que quelqu'un sait comment convertir une chaîne d'ISO-8859-1 en UTF-8 et de retour en Java?

Je récupère une chaîne sur le Web et l'enregistre dans le répertoire RMS (J2ME), mais je souhaite conserver les caractères spéciaux et obtenir la chaîne du répertoire RMS, mais avec ISO-8859-1. codage. Comment puis-je faire cela?

62
c4r1o5

En général, vous ne pouvez pas faire cela. UTF-8 est capable de coder tout point de code Unicode. ISO-8859-1 ne peut en gérer qu'une infime partie. Ainsi, le transcodage d'ISO-8859-1 à UTF-8 ne pose aucun problème. Si vous revenez en arrière d'UTF-8 à ISO-8859-1, des "caractères de remplacement" () apparaissent dans votre texte lorsque des caractères non pris en charge sont détectés.

Pour transcoder du texte:

byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");

ou 

byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");

Vous pouvez exercer plus de contrôle en utilisant les API de niveau inférieur Charset . Par exemple, vous pouvez déclencher une exception lorsqu'un caractère non codable est trouvé ou utiliser un caractère différent pour le texte de remplacement.

92
erickson

Ce qui a fonctionné pour moi:("üzüm bağları" est écrit en turc)

Convertir ISO-8859-1 en 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ı"

Conversion de UTF-8 en 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ı"
7
Bahadir Tasdemir

Si vous avez un String, vous pouvez le faire:

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

Si vous avez un String «cassé», vous avez fait quelque chose de mal, convertir un String en String dans un autre encodage n’est en aucun cas la solution! Vous pouvez convertir un String en un byte[] et vice-versa (à partir d'un encodage). En Java, Strings sont codés AFAIK avec UTF-16, mais il s’agit d’un détail de mise en oeuvre.

Disons que vous avez un InputStream, vous pouvez lire un byte[] puis le convertir en un String en utilisant

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

ou mieux encore (grâce à erickson), utilisez InputStreamReader comme ça:

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

Voici un moyen facile avec la sortie String (j'ai créé une méthode pour le faire):

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

Voici une fonction pour convertir UNICODE (ISO_8859_1) en UTF-8

public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
  final char ch = strISO_8859_1.charAt(i);
  if (ch <= 127) 
  {
      stringBuilder.append(ch);
  }
  else 
  {
      stringBuilder.append(String.format("%02x", (int)ch));
  }
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
    data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                         + Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}

TEST

String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);

System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));

R&EACUTE;SULTAT

ISO_8859_1 strA est = اÙغÙا٠String_ISO_8859_1To_UTF_8 = اللاف

0
che.moor

L'expression régulière peut aussi être bonne et être utilisée efficacement (remplace tous les caractères UTF-8 non couverts dans ISO-8859-1 par un espace):

String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
            + " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
0
Pritam Banerjee

Apache Commons IO La classe Charsets peut être utile:

String utf8String = new String(org.Apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
0
Alberto Segura