java getBytes vs getBytes(字符集)的奇怪行为

java getBytes vs getBytes(字符集)的奇怪行为,java,utf-8,character-encoding,utf-32,Java,Utf 8,Character Encoding,Utf 32,考虑以下几点: 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(

考虑以下几点:

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 
所以我有两个问题:

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

    在这两部分中:为什么输出
    getBytes()
    getBytes(charSet)
    是不同的,尽管我已经特别提到了字符串的字符集

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

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


    问题2:

    为什么utf-32部分中的
    getByte
    的两个字节输出与实际的
    byte[]b
    不同?(即,如何将字符串转换回其原始字节数组?)

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

    这在
    string1=新字符串(b,“UTF-32”)期间已经发生
    字符串string2=新字符串(b,“UTF-8”)

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


    如果要将随机字节数组编码为字符串实例,则应使用十六进制或编码器。您不应使用字符解码器进行此操作。

    问题1:

    在这两部分中:为什么输出
    getBytes()
    getBytes(charSet)
    是不同的,尽管我已经特别提到了字符串的字符集

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

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


    问题2:

    为什么utf-32部分中的
    getByte
    的两个字节输出与实际的
    byte[]b
    不同?(即,如何将字符串转换回其原始字节数组?)

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

    这在
    string1=新字符串(b,“UTF-32”)期间已经发生
    字符串string2=新字符串(b,“UTF-8”)

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



    如果要将随机字节数组编码为字符串实例,则应使用十六进制或编码器。您不应该使用字符解码器。

    字符串/char(16位UTF-16!)/Reader/Writer用于Unicode文本。因此,所有脚本都可以合并到一个文本中

    Java字节(8位)/InputStream/OutputStream用于二进制数据。如果该数据表示文本,则需要知道其编码才能将其转换为文本

    所以从字节到文本的转换总是需要一个字符集。通常存在一个没有字符集的重载方法,然后它默认为
    System.getProperty(“file.encoding”)
    ,这在每个平台上都可能有所不同。 如果数据是跨平台的,则使用默认值是绝对不可移植的


    因此,您错误地认为编码属于字符串。这是可以理解的,因为在C/C++中,无符号字符和字节在很大程度上是可互换的,编码是一场噩梦。

    String/char
    (16位UTF-16!)/Reader/Writer用于Unicode文本。因此,所有脚本都可以合并到一个文本中

    Java字节(8位)/InputStream/OutputStream用于二进制数据。如果该数据表示文本,则需要知道其编码才能将其转换为文本

    所以从字节到文本的转换总是需要一个字符集。通常存在一个没有字符集的重载方法,然后它默认为
    System.getProperty(“file.encoding”)
    ,这在每个平台上都可能有所不同。 如果数据是跨平台的,则使用默认值是绝对不可移植的


    因此,您错误地认为编码属于字符串。这是可以理解的,因为在C/C++中,无符号字符和字节在很大程度上是可互换的,编码是一场噩梦。

    UTF-16编码Unicode,在上述情况下需要使用“代理”字符对编码一个字符。编码是安全的UTF-8,标记高位。因此
    intstring.codepoint(inti)
    Character.charCount(intcp)
    。您正确地看到java中的文本是“Unicode”。当您需要字节时,UTF32可能是一个选项。强制转换UTF-8字节或UTF-16字符只能部分正确,而且是不正确的。我想是这样的,但我想可能不是这样,我错了<代码>字符
    数组似乎