为什么一个中文字符需要一个字符(2个字节)而不是3个字节?
问题描述:
我有以下程序来测试Java如何处理中国字符:为什么一个中文字符需要一个字符(2个字节)而不是3个字节?
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);
打印出来,这是:
编码= UTF-8,世界您好炭[]长度= 4 。,字节[]长度= 12,字节[] 2.length = 12
结果是这些:
如果使用
char[]
来保存汉字,则一个汉字需要一个char
,即2个字节的Java;一个汉字需要3个
byte
s如果用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位数据。您可以通过在维基百科上查找来了解它是如何工作的。
您正在使用不同的编码。你不只是把这些字符的字节。 –
UTF-8编码每个字符最多可以使用4个字节。见https://en.wikipedia.org/wiki/UTF-8 –
欢迎来到文字编码的美妙世界。 –