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?
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.
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ı"
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, String
s 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();
}
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";
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 = اللاف
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);
Apache Commons IO La classe Charsets peut être utile:
String utf8String = new String(org.Apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())