代码点(code point)和代码单元(code units)

来源:互联网 发布:网游单机 数据库 编辑:程序博客网 时间:2024/05/16 14:58

1. 解释一

charJava中,char类型为16个二进制位,原本用于表示一个字符。但后来发现,16位已经不够表示所有的字符,所以后来发展出了代码点表示字符的方法。

代码点(code point):是指编码字符集中,字符所对应的数字。有效范围从U+0000U+10FFFF。其中U+0000U+FFFF为基本字符,U+10000U+10FFFF为增补字符。

代码单元(code unit):对代码点进行编码得到的12个16位序列。其中基本字符的代码点直接用一个相同值的代码单元表示,增补字符的代码点用两个代码单元的进行编码,这个范围内没有数字用于表示字符,因此程序可以识别出当前字符是单单元的基本字符,还是双单元的增补字符。

以上摘自漂洋过海来看你的博客。

2. 解释二

《Java核心技术 卷1》中这样描述:

代码点(code point)是指与一个编码表中的某个字符对应的代码值。UTF-16编码采用不同长度的编码表示所有Unicode代码点,每个16位二进制表示一个代码单元(code unit)。基本字符的范围为[U+0000~U+FFFF],辅助字符,即上面提到的增补字符,其两个代码单元的范围分别为[U+D800~U+DBFF][U+DC00~U+DFFF]。这样很容易就能知道一个代码单元是一个基本字符的编码还是一个辅助字符的第一或第二部分。

3. 解释三

JavaString.length()方法返回的是代码单元(code unit)的个数,而String.codePointCount(0, length)返回的是码点(code point)个数,即字符的个数。当然,通常这两个值是一致的。

System.out.println("---------------我是分割线-----------------");String sentence = "\u0041 \u0042";  // 该字符串的第二个(从一开始计)字符是空格System.out.println(sentence);int lengthU = sentence.length();int lengthP = sentence.codePointCount(0, lengthU);System.out.println(lengthU);        // 3个code unitsSystem.out.println(lengthP);        // 3个code points

如图所示:
这里写图片描述

System.out.println("---------------我是分割线-----------------");String sentence = "\u03C0 \uD835\uDD6B";    // 该字符串的第二个(从一开始计)字符是空格System.out.println(sentence);int lengthU = sentence.length();int lengthP = sentence.codePointCount(0, lengthU);System.out.println(lengthU);        // 4个code unitsSystem.out.println(lengthP);        // 3个code points

如图所示:
这里写图片描述

* 以上是小灰个人的理解,如有错误,欢迎指正。

原创粉丝点击