Java中采用的是Unicode,并且使用UTF-16进行编码.
首先,Unicode中有17个代码层次,除了第一个代码层次意外其余16个代码层次全部需要2个代码单元组成.那么问题就来了:
1.String类的length()方法,在官方API中写明了是返回字符串中包含代码单元的数量,那字符串中如果有中文的话(中文属于其余16个代码层次),那一个中文对应2个代码单元,但我在实际测试当中并非得到这样的结果,而是返回字符的数量(即代码点的数量),而非代码单元的数量.这是我问题之一.
2.char在Java中以16位的形势存在,而1个代码单元占16位.对于第一代码层次UTF-16编码之后的代码单元为16位,对于其它代码层次的代码点编码之后是两个代码单元,即16*2 = 32位.那么一个char类型是不足以储存其它代码层次的代码点,也无法储存需要32位才能存储的中文.但是也实际测得的结果是能够储存的.这是我问题之二.
public class Hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
String green = "国家";
int countUnit = green.length();
int countPoint = green.codePointCount(0, green.length());
char character = green.charAt(0);
System.out.printf(character+" "+countUnit+" "+countPoint);
}//输出结果为国 2 2,但按照这个逻辑应该是"(一个未知的代码单元) 4 2"
}`
Unicode字符编码有两种方案:16位编码与32位编码,对应的字符集分别称为USC-2和USC-4。Java语言采用USC-2字符集,即16位Unicode字符编码,其前128个字符与ASCII字符集完全一致,之后是其他语言文字,如拉丁语、希腊语、汉字等。
char 在java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符。