为什么中文字符需要一个字符(2个字节)但是3个字节?

时间:2017-03-10 03:55:20

标签: 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);

打印输出是这样的:

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

结果如下:

  1. 如果char用于保存中文字符,则一个中文字符需要一个char[],即Java中的2个字节;

  2. 如果byte用于保存中文字符,则一个汉字需要3 byte[] s;

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

    修改

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

1 个答案:

答案 0 :(得分:1)

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