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