查了一大堆,糊里糊涂的。现在知道以下几点:
java采用unicode编码,占两个字节,编码范围是0x0000到0xFFFF,但一共才65536个数,怎么可能表达世界上所有语言文字呢,于是又冒出来一个增补码,占4个字节,范围是0x100000到0x10FFFF。
那么现在假设有一个中文,范围超出了65535,那么它到底是怎么编码的,占几个字节,是几个char?
通常我们会设置编码格式为UTF-8,中文在java中一个汉字表示两个字符,3个字节
public static void main(String[] args) {
String str = "测试";
System.out.println(str.getBytes().length);
}
输出: 6
对于不同的编码格式下所占用的字节数,可参考博客:
不同的编码格式下所占用的字节数
UTF-8三个
GBK两个
public static void main(String[] args) throws Exception{
System.out.println("?".getBytes().length); // \u29100
System.out.println("?".toCharArray().length);
System.out.println("?".toCharArray()[0]);
System.out.println("?".toCharArray()[1]);
System.out.println("中".getBytes().length); // \u4E2D
System.out.println("中".toCharArray().length);
}
输出:
4
2
?
?
3
1
自己测一下就明白了吧,“?”这个字就是你说的超过65535的汉字,在你的eclipse可能显示不出,你用eclipse的默认字体就能看到。
java虚拟机内部使用UTF-16来表示字符:
中:
UTF-16 : 4E2D
?:
UTF-16 : D864 DD00
但是一个char实际上是一个16位整数,最多只能表示65536(Character.MAX_VALUE==65535
)个字符,所以“中”(2个byte==16位)是一个字符,而“?”(4个byte==32位)是两个字符。既然这么说为什么"中".getBytes().length
输出3
呢?前面我们讲的是JVM内部的表达方式, 我写的这个程序的源文件是UTF-8编码的,UTF-8中一个中文字符是3个字节,不管你的java源代码用什么编码java编译器都会将其映射到UTF-16。
下面我们再写一个例子,这次的源代码我们尝试转成GBK试试:
为什么转不了?因为GBK不支持“?”,去掉不支持再转成GBK再运行:
public static void main(String[] args) throws IOException {
System.out.println("中".getBytes().length); // \u4E2D
System.out.println("中".toCharArray().length);
}
输出
2
1
如果楼主非要去追个究竟,我建议你下这篇文章