摘要
- 1.概念
- 2.获取方法
- 3.代码点与代码单元的代码示例
1.概念
代码点(code point):与一个编码表中的某个字符对应的代码值.
在Unicode标准中,代码点采用十六进制书写,并加上前缀U+,
例U+0041就是字母A的代码点.
Unicode的代码点可以分成17个代码级别(code plane).
第一个代码级别成为基本的多语言级别,代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码.
其余的16个附加级别,代码点从U+10000到U+10FFFF,其中包括了一些辅助字符(增补字符).
增补字符是用一个长度为2的char数组表示的,分别表示高代理项和低代理项。
关于增补字符的具体描述请看:关于Java增补字符
代码单元(code unit):在第一代码级别中,每个字符用16位表示(即代码单元);而辅助字符采用一对连续的代码单元进行编码.
UTF-16编码采用不同长度的编码表示所有的Unicode代码点.
通俗理解 :
代码点 : Unicode中的各个字符
代码单元 : 若一个字符的代码长度为16位,则为一个代码单元;若一个字符的代码长度有两个16的代码长度编码,则该字符有两个代码单元.
Unicode(代码点) | 常用字符 | 辅助字符 |
数量(代码单元) | 一个代码单元 | 一对代码单元 |
(图片来源:char 码点和代码单元)
在Java中一个Unicode占2个字节(byte)
一个字节等于8比特位(bit)
因此,每个Unicode码占用16个比特位
2.获取方法
String.length()方法 :
返回采用UTF-16编码表示的给定字符串所需要的代码单元数量.
String.codePointCount(int beginIndex, int endIndex) :
返回此String指定文本范围内的Unicode代码点数.
String.charAt(int index) :
返回位置index的代码单元,n介于0~String.length()-1之间.
3.代码点与代码单元的代码示例
从Unicode字符百科里面找到U+10000以后的一个字符进行试验.
public class CodePointDemo {
public static void main(String[] args) {
String str = "?";
System.out.println(str.length());// 输出该字符串的代码单元的数量
System.out.println(str.codePointCount(0, str.length()));// 输出该字符串的代码点数
System.out.println(Integer.toHexString(str.charAt(0)));// 先获得该字符第一个位置的代码单元的char类型字符,编译器先将char类型强转为int类型的值,后将int值转换为16进制数进行输出
System.out.println(Integer.toHexString(str.charAt(1)));//
System.out.println("\ud801\udcd1");// 将两个char类型字符输出组成了一个代码点?
}
}
/*输出:
2
1
d801
dcd1
?
*/
Integer.toHexString(str.charAt(0))
需要注意,该代码用到了强转
关于强转的详细信息,请看:
首先,str.charAt(0)返回一个char类型字符,Integer.toHexString(int i)接受一个int类型的值,故需要先将char强转为int,在完成该代码.public class StrongTurnDemo { public static void main(String[] args) { String str = "?"; int i = str.charAt(0); System.out.println(i); System.out.println(Integer.toHexString(i)); } } /*输出 : 55297 d801 */
对于char类型来说,charAt(int index)只能获取BMP的字符,对于增补字符,是无法正常获得的.所以当字符串中包含增补字符又该如何获取呢,当文档当中有增补字符呢?请看:如何读取字符串(包含增补字符)?-java