Java getBytes与getBytes(charset)的奇怪行为

呼吸

考虑以下:

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. 为什么getByteutf-32节中的两个字节输出都与实际的不同byte[] b(即,如何将字符串转换回其原始字节数组?)
马丁·波德维斯(Maarten Bodewes)

问题1:

在这两部分中:为什么输出getBytes()getBytes(charSet)有所不同,即使我特别提到了字符串的字符集

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

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


问题2:

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

您不能总是这样做。并非所有字节都代表字符的有效编码。因此,如果解码了此类编码数组,则将默默忽略这些编码,即仅跳过字节。

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

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


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java的String.GetBytes(Charset)中的UTF-8

来自分类Dev

java.lang.String.getBytes()和java.nio.charset.CharsetEncoder.encode()有什么区别?

来自分类Dev

java.lang.String.getBytes()和java.nio.charset.CharsetEncoder.encode()有什么区别?

来自分类Dev

PHP等效于Java中的getBytes

来自分类Dev

Java getBytes UTF-8编码

来自分类Dev

Java字符串getBytes非确定性

来自分类Dev

Android 2.2:解析NoSuchMethodError java.lang.String.getbytes

来自分类Dev

Java中的等效GetBytes函数(如c#)

来自分类Dev

等效于Unix Shell(Cygwin)中Java的String.getBytes()

来自分类Dev

Android 2.2:解析NoSuchMethodError java.lang.String.getbytes

来自分类Dev

Java SecureRandom创建的盐具有不同的getBytes()值

来自分类Dev

String.getBytes(charset)的EBCDIC-charset错误

来自分类Dev

Java重载的奇怪行为

来自分类Dev

Java示例的奇怪行为

来自分类Dev

奇怪的行为java变量

来自分类Dev

Java重载的奇怪行为

来自分类Dev

Java数组:奇怪的行为

来自分类Dev

Java Map 奇怪的行为

来自分类Dev

String.getBytes() 和 Charset.encode() 的区别

来自分类Dev

等待/通知的奇怪Java行为

来自分类Dev

Java return语句的奇怪行为

来自分类Dev

Java-BigInteger奇怪的行为

来自分类Dev

等待/通知的奇怪Java行为

来自分类Dev

Java中时间的奇怪行为

来自分类Dev

Java泛型奇怪的行为

来自分类Dev

Java return语句的奇怪行为

来自分类Dev

Java getBytes()方法正在从我的String中的数字中删除.00

来自分类Dev

Java的字符串 “hello” 具有12个字节时的getBytes( “UTF-16”)?

来自分类Dev

为什么在Java中的每个运行时使用getbytes()更改值?

Related 相关文章

热门标签

归档