gpt4 book ai didi

java - 为什么一个汉字需要一个字符(2 个字节)而不是 3 个字节?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:10 25 4
gpt4 key购买 nike

我有以下程序来测试 Java 如何处理汉字:

String s3 = "世界您好";
char[] chs = s3.toCharArray();
byte[] bs = s3.getBytes(StandardCharsets.UTF_8);
byte[] bs2 = new String(chs).getBytes(StandardCharsets.UTF_8);

System.out.println("encoding=" + Charset.defaultCharset().name() + ", " + s3 + " char[].length=" + chs.length
+ ", byte[].length=" + bs.length + ", byte[]2.length=" + bs2.length);

打印出来的是这样的:

encoding=UTF-8, 世界您好 char[].length=4, byte[].length=12, byte[]2.length=12

结果是这样的:

  1. 一个汉字占用一个char,如果用char[]来存放汉字,在Java中就是2个字节;

  2. 如果用byte[]存放汉字,一个汉字占用3个byte

我的问题是如果 2 个字节就足够了,为什么我们使用 3 个字节?如果 2 个字节不够,为什么我们使用 2 个字节?

编辑:

我的 JVM 的默认编码设置为 UTF-8。

最佳答案

Java char 类型将 16 位数据存储在一个两字节对象中,使用每一位来存储数据。 UTF-8 不这样做。对于汉字,UTF-8 只使用每个字节的 6 位来存储数据。另外两位包含控制信息。 (它因字符而异。对于 ASCII 字符,UTF-8 使用 7 位。)这是一种复杂的编码机制,但它允许 UTF-8 存储最长 32 位的字符。这样做的好处是,对于 7 位 (ASCII) 字符,每个字符只占用一个字节,使其向后兼容 ASCII。但是它需要3个字节来存储16位的数据。您可以通过在维基百科上查找它来了解它的工作原理。

关于java - 为什么一个汉字需要一个字符(2 个字节)而不是 3 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42709916/

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