gpt4 book ai didi

java - java的UTF-16字符编码

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:52 25 4
gpt4 key购买 nike

我试图理解 Java 中的字符编码。 Java 中的字符使用 UTF-16 编码以 16 位存储。因此,当我将包含 6 个字符的字符串转换为字节时,我得到 6 个字节,如下所示,我预计它是 12 个。我是否缺少任何概念?

package learn.java;

public class CharacterTest {

public static void main(String[] args) {
String str = "Hadoop";
byte bt[] = str.getBytes();
System.out.println("the length of character array is " + bt.length);
}
}

O/p :字符数组长度为6

根据@Darshan,当尝试使用 UTF-16 编码获取字节时,结果也不是预期的。

package learn.java;

public class CharacterTest {

public static void main(String[] args) {

String str = "Hadoop";
try{
byte bt[] = str.getBytes("UTF-16");
System.out.println("the length of character array is " + bt.length);

}
catch(Exception e)
{

}
}
}

o/p: the length of character array is 14

最佳答案

在 UTF-16 版本中,你得到 14 个字节,因为插入了一个标记来区分 Big Endian(默认)和 Little Endian。如果您指定 UTF-16LE,您将获得 12 个字节(小端,未添加字节顺序标记)。

参见 http://www.unicode.org/faq/utf_bom.html#gen7


编辑 - 使用此程序查看不同编码生成的实际字节数:

public class Test {
public static void main(String args[]) throws Exception {
// bytes in the first argument, encoded using second argument
byte[] bs = args[0].getBytes(args[1]);
System.err.println(bs.length + " bytes:");

// print hex values of bytes and (if printable), the char itself
char[] hex = "0123456789ABCDEF".toCharArray();
for (int i=0; i<bs.length; i++) {
int b = (bs[i] < 0) ? bs[i] + 256 : bs[i];
System.err.print(hex[b>>4] + "" + hex[b&0xf]
+ ( ! Character.isISOControl((char)b) ? ""+(char)b : ".")
+ ( (i%4 == 3) ? "\n" : " "));
}
System.err.println();
}
}

例如,在UTF-8下运行时(在其他JVM默认编码下,FE和FF的字符显示不同),输出为:

$ javac Test.java  && java -cp . Test hello UTF-16
12 bytes:
FEþ FFÿ 00. 68h
00. 65e 00. 6Cl
00. 6Cl 00. 6Fo

$ javac Test.java  && java -cp . Test hello UTF-16LE
10 bytes:
68h 00. 65e 00.
6Cl 00. 6Cl 00.
6Fo 00.

$ javac Test.java  && java -cp . Test hello UTF-16BE
10 bytes:
00. 68h 00. 65e
00. 6Cl 00. 6Cl
00. 6Fo

关于java - java的UTF-16字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20966802/

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