使用UTF-8编码创建String时存在不一致.
运行此代码:
public static void encodingIssue() throws IOException {
byte[] array = new byte[3];
array[0] = (byte) -19;
array[1] = (byte) -69;
array[2] = (byte) -100;
String str = new String(array, "UTF-8");
for (char c : str.toCharArray()) {
System.out.println((int) c);
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 1.8.0_20(及更早版本)上,我们得到了结果
65533Run Code Online (Sandbox Code Playgroud)
在Java 1.7和1.6上,我们得到了正确的结果:
57052Run Code Online (Sandbox Code Playgroud)
你遇到过这个错误吗?这有解决方法吗?
这种不一致也表现为Shift_JIS,JIS_X0212-1990,x-IBM300,x-IBM834,x-IBM942,x-IBM942C,x-JIS0208,但显然UTF-8更为紧迫.
我们最近将我们的应用程序从JDK 7迁移到了JDK 8.在更改之后,我们遇到了以下代码片段的问题.
String output = new String(byteArray, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
字节数组可能包含无效的UTF-8字节序列.在UTF-8解码时,相同的字节数组在Java 7和Java 8上产生两个不同的字符串.
根据这篇SO帖子的答案,Java 8"修复"了Java 7中的一个错误,并用一个替换字符串替换了无效的UTF-8字节序列,这符合UTF-8规范.
但我们希望坚持使用Java 7的解码字符串版本.
我们尝试在Java 8上使用带有CodingErrorAction的CharsetDecoder作为REPLACE,REPORT和IGNORE.但是,我们无法生成与Java 7相同的字符串.
我们能用合理复杂的技术做到这一点吗?