Как конвертировать между ISO-8859-1 и UTF-8 в Java?

кто-нибудь знает, как преобразовать строку из ISO-8859-1 в UTF-8 и обратно в Java?

Я получаю строку из интернета и сохраняю ее в RMS (J2ME), но я хочу сохранить специальные символы и получить строку из RMS, но с кодировкой ISO-8859-1. Как мне это сделать?

5 ответов


В общем, вы не можете этого сделать. UTF-8 способен кодировать любую кодовую точку Юникода. ISO-8859-1 может обрабатывать только крошечную часть из них. Таким образом, перекодирование с ISO-8859-1 на UTF-8 не является проблемой. Переход от UTF-8 к ISO-8859-1 приведет к появлению в тексте "заменяющих символов" (�) при обнаружении неподдерживаемых символов.

для перекодирования текста:

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

или

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

вы можете осуществлять больший контроль, используя нижний уровень Charset API-интерфейсы. Например, можно создать исключение при обнаружении некодируемого символа или использовать другой символ для замены текста.


что сработало для меня: ("üzüm bağları" правильно написано на турецком языке)

перевести единицы: ISO-8859-1 в 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ı"

перевести единицы: UTF-8 в 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ı"

если у вас String, вы можете сделать это:

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

если у вас "битые"String, вы сделали что-то неправильно, преобразовав String до String в другой кодировке defenetely не путь! Вы можете преобразовать String до byte[] и наоборот (учитывая кодировку). В Java StringS кодируются AFAIK с UTF-16 но это деталь реализации.

скажите, что у вас есть InputStream, вы можете прочитать в byte[] а затем преобразовать это в String используя

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

или даже лучше (благодаря Эриксону) использовать InputStreamReader вот так:

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

вот простой способ вывода строки (я создал метод для этого):

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

Apache Commons IO класс Charsets может пригодится:

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