1、Unicode 标准已不局限于16 位编码的65,536 个字符,已扩展到包含多达 1,112,064 个字符,其中16位之后表示的是增补字符。
2、J2SE 的 5.0 版支持 Unicode 标准 4.0 版,且支持增补字符。
3、代码点codePoint、代码单元(char16位)、字符、字符子集(块)UnicodeBlock。
4、有效的 Unicode 代码点范围是 U+0000 至 U+10FFFF,其中从 U+0000 至 U+FFFF 之间的字符集有时候被称为基本多语言面 (BMP);增补字符是代码点在 U+10000 至 U+10FFFF 范围之间的字符,也就是那些使用原始的 Unicode 的 16 位设计无法表示的字符。
5、增补字符编码为两个代码单元,第一个单元来自于高代理范围(U+D800 至 U+DBFF),第二个单元来自于低代理范围(U+DC00 至 U+DFFF)。在UTF-16中值 U+D800 至 U+DFFF被保留使用,可以通过方法识别是否该代码单元表示某个单单元字符,或者是否该代码单元是某个双单元字符的第一个或第二单元。
6、一个代码点在不同编码方案下由不同的代码单元组成。如下:
下表所示为几个字符不同表达方式的比较:
Unicode 代码点 |
U+0041
|
U+00DF
|
U+6771
|
U+10400
|
表示字形 |
|
|
|
|
UTF-32 代码单元 |
|
|
|
|
UTF-16 代码单元 |
|
|
|
|
UTF-8 代码单元 |
|
|
|
|
7、常用的代码点与代码单元之间转换方法:
Character.toCodePoint(char high, char low)(用于将两个 UTF-16 代码单元转换为一个代码点);
Character.toChars(int codePoint)(用于将指定的代码点转换为一个或两个 UTF-16 代码单元,然后封装到一个 char[]
内);
Character.codePointAt(char[] a, int index)
(用于将代码点从各种字符序列表示法中提取出来);
针对 StringBuffer
和 StringBuilder
类的 appendCodePoint(int codePoint)
方法(在将代码点插入字符序列时);
Character 类中的 isHighSurrogate
和 isLowSurrogate
方法(可以识别用于表示增补字符的 char
值);
charCount(int codePoint) 方法(确定是否需要将某个代码点转换为一个或两个 char);
Character.UnicodeBlock.of(int codePoint)
(可搜索代码点所属的 Unicode 字符子集);
Character.isValidCodePoint 方法(确保代码点有效);