码点、代码空间以及codePoint

Author Avatar
Mizore 3月 18, 2020

码点和代码单元

背景

在设计Java时,当时的Unicode才发布1.0版本,字符连65536代码值一半都不到,为了方便后面增加,Java使用了16位的Unicode字符集。但是没想到,随着计算机的普及,各国计算机的发展,16位也不够用了,于是后来使用了码点来解决这个问题。

代码单元

Java中char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元,基本的Unicode字符使用一个代码单元就可以表示,而辅助字符需要两个代码单元表示。

码点

码点是指一个编码表中的某个字符对应的代码值。Unicode的码点分为17个代码级别,第一个级别是基本的多语言级别,码点从U+0000——U+FFFF,其余的16个级别从U+10000——U+10FFFF,其中包括一些辅助字符。
基本的多语言级别,每个字符用16位表示代码单元,而辅助字符采用连续的一对连续代码单元进行编码。

总结

代码单元数量不是一个String字符串的实际长度,而码点数量才是肉眼可见的字符数量。

故使用length()方法返回的值不是字符串实际长度,要返回字符串实际长度可以使用codePointCount()方法。

codePoint字样方法

int codePointAt(int index)

此方法返回从给定位置开始的码点,使用方法如下:

 String x="hello";
        int[] y=new int[1];
        y[0]=x.codePointAt(0);

返回的码点可以存到数组中然后可以构造一个字符串。

new String(int[] codePoints, int offset, int count)

用数组从offset开始的count个码点构造一个字符串。

接上,使用方法为:

String z=new String(y,0,1);
        System.out.println(z);

运行结果为:

ex

int codePointCount(int startIndex, int endIndex)

返回startIndex和endIndex-1之间的码点个数。

另外,码点和代码空间除了上面的使用方法外,还在其他地方得到使用。