考虑以下:
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
utf-32节中的两个字节输出都与实际的不同byte[] b
?(即,如何将字符串转换回其原始字节数组?)问题1:
在这两部分中:为什么输出
getBytes()
和getBytes(charSet)
有所不同,即使我特别提到了字符串的字符集
您指定的字符集将在字符串的字符编码到字节数组的过程中使用(即仅在方法本身中)。它不是String
实例本身的一部分。您没有为字符串设置字符集,也不存储该字符集。
Java没有字符集的内部字节编码。它char
内部使用数组。如果您在String.getBytes()
未指定字符集的情况下进行呼叫,它将使用平台默认值-例如Windows计算机上的Windows-1252。
问题2:
为什么
getByte
utf-32节中的两个字节输出都与实际的不同byte[] b
?(即,如何将字符串转换回其原始字节数组?)
您不能总是这样做。并非所有字节都代表字符的有效编码。因此,如果解码了此类编码数组,则将默默忽略这些编码,即仅跳过字节。
这已在String string1 = new String(b,"UTF-32");
和期间发生String string2 = new String(b,"UTF-8");
。
您可以使用的实例更改此行为,使用CharsetDecoder
检索Charset.newDecoder
。
如果要将随机字节数组编码为String实例,则应使用十六进制或基数为64的 编码器。您不应该为此使用字符解码器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句