Java - 为什么String(a).getBytes()== a不能给出相同的结果?

时间:2014-10-24 19:46:24

标签: java

对于示例数组:

byte[] arr = {37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, -104 };

代码:

String a = new String(arr, Charset.forName("US-ASCII"));
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(a.getBytes(Charset.forName("US-ASCII"))));
System.out.println( Arrays.equals(arr, a.getBytes(Charset.forName("US-ASCII"))) );

结果是:

  • 在“Windows-1251”中:

    [37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, -104]
    [37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, 63]
    false
    
  • 在“US-ASCII”中:

    [37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, -104]
    [37, 80, 68, 70, 45, 49, 46, 53, 13, 37, 63, 63, 63, 63, 63, 63]
    false
    
  • 在“UTF-8”中:

    [37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, -104]
    [37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -17, -65, -67, -17, -65, -67, -17, -65, -67, -45, -121, -17, -65, -67]
    false
    

我测试了各种测试用例,发现当有负数时它们会给出不同的数组。我尝试使用“Windows-1251”,就像在question中一样,但阵列仍然不同。 所以我的问题是:

  • 为什么?
  • 如何解决?

添加信息:

  • 我正在使用JRE8和Windows 8.1。

解决方案:使用Charset ISO-8859-1,感谢SLaks解释和JB Nizet指出ISO-8859-1

String a = new String(arr, Charset.forName("ISO-8859-1"));
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(a.getBytes(Charset.forName("ISO-8859-1"))));
System.out.println( Arrays.equals(arr, a.getBytes(Charset.forName("ISO-8859-1"))) );

结果:

[37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, -104]
[37, 80, 68, 70, 45, 49, 46, 53, 13, 37, -30, -29, -49, -45, -121, -104]
true

1 个答案:

答案 0 :(得分:3)

63是?的代码点 对于在该编码中无效的每个字节,解码器将返回?

对于US-ASCII,包括127以上的每个字节。

对于UTF-8,其中包括127以上的每个字节,这些字节不遵循正确的UTF8规则。

相关问题