Преобразование между UTF-8 и ISO 8859-1: - PullRequest
1 голос
/ 17 февраля 2012

Я нашел следующий код в SO.Это действительно работает?

String xml = new String("áéíóúñ");
byte[] latin1 = xml.getBytes("UTF-8");
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");

Я имею в виду, latin1 кодируется в кодировке UTF-8 во второй строке, но читается как кодировка ISO-8859-1 в третьей строке?Может ли это когда-нибудь сработать?

Не то чтобы я не хотел критиковать цитируемый код, я просто запутался, поскольку наткнулся на какой-то устаревший код, который очень похож, кажется, работает, и я не могу объяснить, почему

РЕДАКТИРОВАТЬ: Я предполагаю, что в оригинальном пост , «UTF-8» в строке 2 был просто TYPO.Но я не уверен ...

EDIT2: После моей первоначальной публикации кто-то отредактировал приведенный выше код и изменил 2-ю строку на byte[] latin1 = xml.getBytes("ISO-8859-1");.Я не знаю, кто это сделал и почему он это сделал, но, очевидно, это сильно испортило.Извините всех, кто видел неправильную версию кода.Я не знаю, кто редактировал это.Код выше правильный сейчас.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

getBytes(Charset charset) приводит к массиву байтов, закодированному с использованием charset, поэтому значение latin1 кодируется в формате UTF-8.

Укажите System.out.println(latin1.length); в качестве третьей строки, и он сообщит вам, что длина массива байтов равна12. Это означает, что он действительно в кодировке UTF-8.

new String(latin1, "ISO-8859-1") неверно, потому что latin1 кодирован в UTF-8, и вы предлагаете проанализировать его как ISO-8859-1.Вот почему он создает строку, состоящую из 12 символов мусора: áéíóúñ.

Когда вы получаете байты из áéíóúñ, используя кодировку UTF-8, это приводит к массиву из 24 байтов.

Надеюсь, теперь все ясно.

0 голосов
/ 17 февраля 2012

Эти символы присутствуют в обеих кодировках символов. Просто UTF-8 и ISO-8859-1 используют каждое различное представление байтов каждого символа вне диапазона ASCII.

Если вы использовали символ, который присутствует в UTF-8, но отсутствует в ISO-8859-1, то, конечно, он потерпит неудачу.

...