2017-03-10 124 views
0

我有以下程序来测试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

结果是这些:

  1. 如果使用char[]来保存汉字,则一个汉字需要一个char,即2个字节的Java;

  2. 一个汉字需要3个byte s如果用byte[]来保存汉字;

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

编辑:

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

+0

您正在使用不同的编码。你不只是把这些字符的字节。 –

+1

UTF-8编码每个字符最多可以使用4个字节。见https://en.wikipedia.org/wiki/UTF-8 –

+0

欢迎来到文字编码的美妙世界。 –

回答

0

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

相关问题