Java中关于char和String对于代码点和代码单元的提问
PHP中文网
PHP中文网 2017-04-18 09:51:35
0
2
839

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"

}`

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
小葫芦

Unicode字元編碼有兩種方案:16位元編碼與32位元編碼,對應的字元集分別稱為USC-2和USC-4。 Java語言採用USC-2字元集,即16位元Unicode字元編碼,其前128個字元與ASCII字元集完全一致,之後是其他語言文字,如拉丁文、希臘文、漢字等。

char 在java中是2個位元組。 java採用unicode,2個位元組(16位元)來表示一個字元。

Peter_Zhu

不是所有的中國文字的編碼都佔用兩個代碼單元,國家二字對應的unicode編碼分別為u56fd u5bb6,一個字只佔用一個單元。而有些漢字是需要用兩個代碼單元編碼的 例如 CJK統一漢字擴充A中包含的文字 例:“

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板