背景
在设计Java时决定采用16位的Unicode字符集,因为当时只用不到65536一半的大小就可以存放下Unicode1.0版本的字符集。但是十分遗憾,一段时间之后Unicode字符数量超过了65536个,显然16位的char类型已经不能满足描述所有的Unicode字符的需要了。因此出现了代码点。
代码点
指与一个编码表中的某个字符对应的代码值。在Unicode标准中,代码点采用十六进制表示,加上前缀U+,例如A的代码点为U+0041。代码点分为17个级别。
U+0000到U+FFFF 为第一个级别称为基本的多语言级别,包括经典的Unicode字符。
U+10000到U+10FFFF 为16个附加级别,包括一些辅助字符。
代码单元
UTF-16编码采用不同长度的编码表示所有的Unicode代码点。第一级别的代码点,每个字符用16位表示,通常称为代码单元;剩下16个附加级别的代码点采用一对连续的代码单元进行编码。
在Java中,char类型用UTF-16编码一个代码单元。
public class Example {
public static void main(String[] args) {
String a = "Hello";
int count = a.codePointCount(0, a.length()); //字符串a中代码点的数量,5
char temp = a.charAt(0); //字符串a中的第一个代码单元,H
for (int i = 0; i < a.length(); ) { //遍历字符串a的每一个代码点
int cp = a.codePointAt(i); //返回给定位置i开始的代码点
System.out.println(cp); //依次输出72 101 108 108 111
if (Character.isSupplementaryCodePoint(cp)) i += 2;
else i++;
}
}
}