Java UTF-8 解码中的 8 个变化

Java 8 change in UTF-8 decoding

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

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

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

根据answer to this SO post,Java 8 "fixes" Java 7 中的一个错误,并用替换字符串替换无效的 UTF-8 字节序列,该替换字符串位于符合UTF-8规范。

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

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

我们可以使用合理复杂的技术来做到这一点吗?

根据@Holger 提供的指示,很明显我们必须编写自定义 CharsetDecoder。

我复制了 OpenJDK 版本的 sun.nio.cs.UTF_8 class,将其重命名为 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"));