对于示例数组:
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中一样,但阵列仍然不同。 所以我的问题是:
添加信息:
解决方案:使用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
答案 0 :(得分:3)
63是?
的代码点
对于在该编码中无效的每个字节,解码器将返回?
。
对于US-ASCII
,包括127以上的每个字节。
对于UTF-8
,其中包括127以上的每个字节,这些字节不遵循正确的UTF8规则。