在java中一个char类型为16个二进制位,原本用于表示一个字符。但后来发现,16位已经不够表示所有的字符,所以后来发展出了代码点表示字符的方法。
代码点:
代码点(code point)是指编码字符集中,字符所对应的数字。有效范围从U+0000到U+10FFFF。其中U+0000到U+FFFF为基本字符,U+10000到U+10FFFF为增补字符。
代码单元:
代码单元(code unit):对代码点进行编码得到的1或2个16位序列。其中基本字符的代码点直接用一个相同值的代码单元表示,增补字符的代码点用两个代码单元的进行编码,这个范围内没有数字用于表示字符,因此程序可以识别出当前字符是单单元的基本字符,还是双单元的增补字符。
代码点与代码单元:
一个代码单元为16位二进制,一个代码点为一个或两个16位二进制。即一个代码点可表示为一个代码单元或两个代码单元。
代码体现:
String类中length方法返回的是代码单元的个数,codePointCount返回的是代码点的个数。
offsetByCodePoints方法返回的是从给定的index处偏移codePointOffset个代码点的索引。
String str = "\u03C0\uD835\uDD6B"; //\uD835\uDD6B 代表两个代码单元代,一个代码点
System.out.println(str.length());//输出3
System.out.println(str.codePointCount(0,str.length()));;//输出2