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"));
我们最近将我们的应用程序从 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"));