为什么一个汉字需要一个字符(2个字节)却占用3个字节?

pet*_*ton 5 java character-encoding

我有以下程序来测试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);
Run Code Online (Sandbox Code Playgroud)

打印出来是这样的:

编码=UTF-8,???char[].length=4, byte[].length=12, byte[]2.length=12

结果是这些:

  1. 一个汉字取一个char,在Java中为2个字节,ifchar[]用来存放汉字;

  2. 一个汉字byte如果byte[]用于容纳汉字需要3s;

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

编辑:

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

Mig*_*noz 5

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