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

时间:2018-02-01 16:49:36

标签: java utf-8 character-encoding iso-8859-1

我必须处理一个不受我控制的图书馆。它提供了一个字符串,它使用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对任意字节数组进行解码/重新编码不会导致原始字节数组的情况?

2 个答案:

答案 0 :(得分:3)

由于ISO-8859-1是每个字符编码1个字节,因此它始终有效。 UTF-8字节转换为不正确的字符,但幸运的是没有信息丢失。

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

与此相反的是(总是¹)为真,因为UTF-8是多字节编码。编码过程可能会遇到无效的字节序列,并用替换字符?替换它们。此时您丢失了信息,无法再恢复原始字节。

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

答案 1 :(得分:-3)

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