代码点和代码单元
代码点(code point):与一个编码表中的某个字符对应的代码值.
在Unicode标准中,代码点采用十六进制书写,并加上前缀U+,例
U+0041就是字母A的代码点.
Unicode的代码点可以分成17个代码级别(code plane).第一个代码级别成为基本的多语言级别,代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码.
其余的16个附加级别,代码点从U+10000到U+10FFFF,其中包括了一些辅助字符(增补字符).
简单理解:代码点是针对Unicode字符集而言的,一个代码点就是一个编号而已,表示一个数字映射一个字符
。代码点就是每个字符的唯一身份(以Unicode而言),但Unicode并没有涉及到字符的储存,没有规定一个代码点的储存方式(UTF-8/UTF-16/UTF-32是几种计算机储存的方案),而代码单元指的是该方案最少需要多少个字节编码一个Unicode字符。
UTF-8的代码单元是1个字节,UTF-16的代码单元是两个字节,UTF-32是4个字节。在Java中,字符内部使用的是UTF-16
示例:
package Test;
public class Test {
public static void main(String[] args) {
//在java中 char数据类型是一个采用UTF-16编码表示的Unicode代码单元
//常用字符一个代码单元即可表示但是辅助字符通常要一对 𝕆 2个字符单元
String a="hi𝕆"; //4个字符单元(char) 3个码点
String b="\uD835\uDD46"; // 𝕆
int n=a.length(); //以UTF-16编码表示给定字符串所需要的代码单元数量
// 4
var cpCount=a.codePointCount(0,a.length()); //实际长度->码点数量
// 3
//a.charAt(n)返回位置n的代码单元
char s1=a.charAt(0); // h
char s2=a.charAt(1); // i
char s3=a.charAt(2); // 强转为int 55349
char s4=a.charAt(3); // 强转为int 56646
//得到第i个码点
int i=2; //𝕆
int index=a.offsetByCodePoints(0,i);
int codePoint=a.codePointAt(index);
}
}
结果符合。