修复 Java 中错误的 ISO-8859-1 解码 UTF-8 字符串

Fixing incorrectly ISO-8859-1 decoded UTF-8 string in Java

我必须处理一个不受我控制的库。它提供一个字符串,它使用 ISO-8859-1 从字节流中解码出来。但是字节流是UTF-8。所以很明显,如果它包含非 ASCII 字符,我得到的结果字符串是错误的。

所以我解决这个问题的方法是将字符串转换回字节流并使用 UTF-8 再次解码。像这样:

byte[] raw = inputText.getBytes(StandardCharsets.ISO_8859_1);
String correctedText = new String(raw, StandardCharsets.UTF_8);

我用很多例子测试了它,它似乎有效。然而,这是否总是正确的,或者在某些情况下这不起作用?换句话说:是否存在使用 ISO-8859-1 解码/重新编码任意字节数组不会产生原始字节数组的情况?

因为 ISO-8859-1 是每个字符 1 个字节的编码,所以它总是有效的。 UTF-8 字节被转换为不正确的字符,但幸运的是没有信息丢失。

使用 ISO-8859-1 编码将字符改回字节,即可得到原始字节数组,其中包含以 UTF-8 编码的字符,因此您可以使用正确的编码安全地重新解释它。

与此相反的情况并非(总是¹)正确,因为 UTF-8 是多字节编码。编码过程可能会遇到无效的字节序列,将其替换为替换字符?。那时你已经丢失了信息并且无法再取回原始字节。

¹ 如果您坚持使用 0-127 范围内的字符,它将起作用,因为它们使用单​​个字节在 UTF-8 中编码。

UTF-8 和 ISO-88-1 编码 ASCII 字符的方式相同。鉴于此你不应该有任何损失,因为你的原始输入是 ASCII。