Java 8改变了UTF-8解码

时间:2015-06-01 13:59:07

标签: java utf-8 java-8 regression

我们最近将我们的应用程序从JDK 7迁移到了JDK 8.在更改之后,我们遇到了以下代码片段的问题。

String output = new String(byteArray, "UTF-8");

字节数组可能包含无效的UTF-8字节序列。在UTF-8解码时,相同的字节数组会在Java 7和Java 8上产生两个不同的字符串。

根据answer到此SO post,Java 8“修复”Java 7中的错误并用替换字符串替换无效的UTF-8字节序列,该字符串符合UTF- 8规范。

但我们希望坚持使用Java 7的解码字符串版本。

我们尝试在Java 8上使用带有CodingErrorAction的CharsetDecoder作为REPLACE,REPORT和IGNORE。但是,我们无法生成与Java 7相同的字符串。

我们能用合理复杂的技术做到这一点吗?

1 个答案:

答案 0 :(得分:7)

从@Holger提供的指针中可以看出,我们必须编写一个自定义的CharsetDecoder。

我复制了OpenJDK版本的sun.nio.cs.UTF_8类,将其重命名为CustomUTF_8并用它来构造一个像这样的字符串

String output = new String(bytes, new CustomUTF_8());

我计划运行大量测试,交叉验证在Java 7和Java 8上生成的输出。这是一个临时解决方案,而我正在尝试修复将输出从hmac直接传递到String而不用Base64编码的实际问题。

 String output = new String(Base64.Encoder.encode(bytes), Charset.forname("UTF-8"));