String (bytes[] Charset) 在 Java7 和 java 8 中返回不同的结果

String (bytes[] Charset) is returning results differently in Java7 and java 8

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Java87String {

public static void main(String[] args) throws UnsupportedEncodingException {
        // TODO Auto-generated method stub

        //byte[] b = {-101, 53, -51, -26, 24, 60, 20, -31, -6, 45, 50, 103, -66, 28, 114, -39, 92, 23, -47, 32, -5, -122, -28, 79, 22, -76, 116, -122, -54, -122};
        //byte[] b = {-76, -55, 85, -50, 80, -23, 27, 62, -94, -74, 47, -123, -119, 94, 90, 61, -63, 73, 56, -48, -54, -4, 11, 79};

        byte[] b = { -5, -122, -28};

        System.out.println("Input Array :" + Arrays.toString(b));
        System.out.println("Array Length : " + b.length);                       
        String target = new String(b,StandardCharsets.UTF_8);
        System.out.println(Arrays.toString(target.getBytes("UTF-8")));
        System.out.println("Final Key :" + target);

}
}

上面的代码returns下面输出在Java7

Input Array :[-5, -122, -28]
Array Length : 3
[-17, -65, -67]
Final Key :�

同样的代码returns下面输出在Java8

Input Array :[-5, -122, -28]
Array Length : 3
[-17, -65, -67, -17, -65, -67, -17, -65, -67]
Final Key :���

听起来 Java8 用默认序列 [-17, -65, -67] 替换是正确的。

为什么 JDK 修复此问题的 1.7 中的输出和任何已知错误存在差异?

我认为 (-5, -122, -28) 是一个无效的 UTF-8 字节序列,因此在这种情况下 JVM 可能会输出任何内容。如果它是有效的,也许不同的 Java 版本可以显示相同的输出。

这个特定的字节序列有意义吗?只是好奇

根据 String JavaDoc:

The behavior of this constructor when the given bytes are not valid in the given charset is unspecified. The CharsetDecoder class should be used when more control over the decoding process is required.