Java中关于char和String对于代码点和代码单元的提问

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"

}`


万千封印
浏览 514回答 2
2回答

慕标琳琳

Unicode字符编码有两种方案:16位编码与32位编码,对应的字符集分别称为USC-2和USC-4。Java语言采用USC-2字符集,即16位Unicode字符编码,其前128个字符与ASCII字符集完全一致,之后是其他语言文字,如拉丁语、希腊语、汉字等。char 在java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java