gpt4 book ai didi

java - java getBytes 与 getBytes(charset) 的奇怪行为

转载 作者:行者123 更新时间:2023-11-29 03:07:05 31 4
gpt4 key购买 nike

考虑以下几点:

public static void main(String... strings) throws Exception {
byte[] b = { -30, -128, -94 };

//section utf-32
String string1 = new String(b,"UTF-32");
System.out.println(string1); //prints ?
printBytes(string1.getBytes("UTF-32")); //prints 0 0 -1 -3
printBytes(string1.getBytes()); //prints 63

//section utf-8
String string2 = new String(b,"UTF-8");
System.out.println(string2); // prints •
printBytes(string2.getBytes("UTF-8")); //prints -30 -128 -94
printBytes(string2.getBytes()); //prints -107
}

public static void printBytes(byte[] bytes){
for(byte b : bytes){
System.out.print(b + " " );
}

System.out.println();
}

输出:

?
0 0 -1 -3
63

-30 -128 -94
-107

所以我有两个问题:

  1. 在两个部分中:为什么输出 getBytes()getBytes(charSet) 是不同的,即使我已经特别提到了字符串的字符集
  2. 为什么 utf-32 部分中 getByte 的两个字节输出与实际的 byte[] b 不同? (即如何将字符串转换回其原始字节数组?)

最佳答案

问题一:

in both sections : why the output getBytes() and getBytes(charSet) are different even though I have specifically mentioned the string's charset

您指定的字符集在字符串到字节数组的字符编码期间使用(即仅在方法本身中)。它不是 String 实例本身的一部分。您没有为字符串设置字符集,字符集没有被存储。

Java没有字符集的内部字节编码;它在内部使用 char 数组。如果您在未指定字符集的情况下调用 String.getBytes(),它将使用平台默认值 - 例如Windows 机器上的 Windows-1252。


问题二:

why both of the byte outputs of getByte in section utf-32 are different from the actual byte[] b? (i.e. how can I convert back a string to its original byte array?)

你不能总是这样做。并非所有字节都代表有效的字符编码。因此,如果这样的编码数组被解码,那么这些类型的编码将被默默地忽略,即字节被简单地跳过。

这已经发生在 String string1 = new String(b,"UTF-32");String string2 = new String(b,"UTF-8");.

您可以使用 CharsetDecoder 的实例更改此行为, 使用 Charset.newDecoder 检索.


如果您想将一个随机字节数组编码为一个字符串实例,那么您应该使用十六进制或base 64编码器。你不应该为此使用字符解码器

关于java - java getBytes 与 getBytes(charset) 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611857/

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