Как я преобразовываю между ISO-8859-1 и UTF-8 в Java?

Добавьте jstl-1.2.jar в папку tomcat/lib.

При этом ваша ошибка зависимостей будет исправлена ​​снова.

66
задан Michael Myers 16 March 2009 в 21:47
поделиться

2 ответа

В целом Вы не можете сделать этого. UTF-8 способен к кодированию любой кодовой точки Unicode. 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. Например, можно повысить исключение, когда un-encodable символ найден, или используйте другой символ для текста замены.

94
ответ дан erickson 7 November 2019 в 11:11
поделиться

Если Вы имеете String, можно сделать это:

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

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

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

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

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

InputStreamReader isr;
try {
     isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}
6
ответ дан Johannes Weiss 7 November 2019 в 11:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: