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)
是不同的,尽管我已经特别提到了字符串的字符集getByte
的两个字节输出与实际的byte[]b
不同?(即,如何将字符串转换回其原始字节数组?)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字符只能部分正确,而且是不正确的。我想是这样的,但我想可能不是这样,我错了<代码>字符
数组似乎