gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:15:54 25 4
gpt4 key购买 nike

例如数组:

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但阵列仍然不同。所以我的问题是:

  • 为什么?
  • 如何解决?

附加信息:

  • 我在 Windows 8.1 上使用 JRE8。

解决方案:使用字符集 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

最佳答案

63 是 ? 的代码点。
解码器将为该编码中无效的每个字节返回一个 ?

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

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

关于Java - 为什么 String( a).getBytes() == a 不给出相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com