Поскольку, по-видимому, существует некоторая путаница в отношении того, возможно ли это или нет, я думаю, что мне нужно привести обширный пример.
В вопросе утверждается, что (начальный) ввод - это byte[]
, который содержит данные, закодированные в Windows-1252 . Я назову это byte[]
ib
(для «начальных байтов»).
Для этого примера я выберу немецкое слово "Bär" (что означает "медведь") в качестве ввода:
byte[] ib = new byte[] { (byte) 0x42, (byte) 0xE4, (byte) 0x72 };
String correctString = new String(ib, "Windows-1252");
assert correctString.charAt(1) == '\u00E4'; //verify that the character was correctly decoded.
(Если ваша JVM не поддерживает эту кодировку, вы можете вместо этого использовать ISO-8859-1, потому что эти три буквы (и большинство других) находятся в одной позиции в этих двух кодировках).
Далее говорится, что какой-то другой код (который находится вне нашего влияния) уже преобразовал этот byte[]
в строку, используя кодировку UTF-8 (я назову это String
is
для " строка ввода"). То, что String
- это единственный вход , который доступен для достижения нашей цели (если бы is
было доступно, это было бы тривиально):
String is = new String(ib, "UTF-8");
System.out.println(is);
Это, очевидно, приводит к неправильному выводу "B ".
Цель состоит в том, чтобы создать ib
(или правильное декодирование этого byte[]
) с только is
.
Теперь некоторые люди утверждают, что получение кодированных UTF-8 байтов из этого is
вернет массив с теми же значениями, что и исходный массив:
byte[] utf8Again = is.getBytes("UTF-8");
Но это возвращает кодировку UTF-8 двух символов B
и �
и определенно возвращает неправильный результат при повторной интерпретации как Windows-1252:
System.out.println(new String(utf8Again, "Windows-1252");
В этой строке выводится «B�», что совершенно неверно (это также тот же вывод, который был бы результатом, если бы в исходном массиве содержалось не слово «Bür»).
Так что в этом случае вы не можете отменить операцию, потому что информация потеряна.
Там есть на самом деле случаи, когда такие неправильные кодировки могут быть отменены. Это более вероятно, если все возможные (или, по крайней мере, встречающиеся) последовательности байтов действительны в этой кодировке. Поскольку UTF-8 имеет несколько последовательностей байтов, которые просто не являются допустимыми значениями, у вас будет проблемы.