字符和码位
- 字符:又叫抽象字符,是用于组织、控制 或 表示 文本数据 的 信息单元。
- 码位:是分配给单个字符的一个数字。
U+<hex>是码位的格式,其中U+代表 Unicode 的前缀,而<hex>表示十六进制数字。
每一个字符都有对应的码位,如 A 对应 U+0041。但是并非所有码位都有关联字符。
Unicode 平面
平面是从 U+n0000 到 U+nFFFF 的 65536 个连续的码位,n 的取值范围从 0 到 16。平面将全部的 Unicode 码位分成了 17 个均等的组。
基本多文种平面为 U+0000 到 U+FFFF,简称 BMP(Basic Multilingual Plane)。其余 16 个平面称为星光平面或辅助平面。
码元
码元是用于以给定编码格式,对每个字符编码的一个二进制位序列。在不同的编码格式中,一个码元有多少字节是不同的。
UTF-8 中一个码元可能有 1 - 4 个字节。UTF-16 中一个码元有 2 个字节。UTF-32 中一个码元有 4 个字节。
代理对
在 UTF-16 中代理对是对那些由 2 个 16 位长的码元所组成序列的单个抽象字符的表示方式。代理对中的首个值为高位代理码元,而第二个值为低位代理码元。高位代理码元从 0xD800 到 0xDBFF 取值。低位代理码元从 0xDC00 到 0xDFFF 取值。
在 UTF-16 中,对于基本多文种平面,一个 16 位长的码元就可以解决了。但是对星光平面内的码元,如 U+1F600,需要两个 16 位长的码元才能将其表示,这就是代理对。U+1F600 对应的代理对是 0xD83D 0xDE00。转换方法如下所示。
1 | function getSurrogatePair(astralCodePoint) { |
组合符号
字位又称形素、字素、或符号,对一些书写系统来说是最小的构成单位。
在绝大多数情况下,单个 Unicode 字符表示单个的字位。但也存在单个字位包含一系列字符的情况。例如 å 在丹麦书写系统中是一个原子性的字位,展示它需要使用 U+0061 和 U+030A 组合在一起。
组合字符会被用户认为是单个字符,但开发者必须使用 2 个码位来表示它。
参考文献
每个 JavaScript 开发者都应该了解的 Unicode
What every JavaScript developer should know about Unicode