我有以下程序来测试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
结果如下:
如果char
用于保存中文字符,则一个中文字符需要一个char[]
,即Java中的2个字节;
如果byte
用于保存中文字符,则一个汉字需要3 byte[]
s;
我的问题是,如果2个字节足够,为什么我们使用3个字节?如果2个字节不够,为什么我们使用2个字节?
修改
我的JVM默认编码设置为UTF-8。
答案 0 :(得分:1)
Java char类型在两字节对象中存储16位数据,使用每个位来存储数据。 UTF-8不会这样做。对于中文字符,UTF-8仅使用每个字节的6位来存储数据。其他两位包含控制信息。 (它取决于字符。对于ASCII字符,UTF-8使用7位。)它是一种复杂的编码机制,但它允许UTF-8存储长达32位的字符。这样做的好处是每个字符只占一个字节用于7位(ASCII)字符,使其向后兼容ASCII。但它需要3个字节来存储16位数据。您可以通过在维基百科上查找它来了解它的工作原理。