Jakob Jenkov 2022-08-06
Unicode 是一种用于文本字符的编码标准,能够表示全球多种语言中的字符。每个字符由一个 Unicode 码点(code point) 表示。码点是一个整数值,唯一标识该字符。
Unicode 字符可以使用不同的编码方式(如 UTF-8 或 UTF-16)进行编码。这些编码方式规定了如何将每个字符的 Unicode 码点转换为一个或多个字节。当前,UTF-8 是在文本文档、JSON、HTML 等场景中最常用的 Unicode 编码方式。
Unicode 码点(Code Points)
如前所述,每个 Unicode 字符都由一个 Unicode 码点表示,该码点是一个整数。
码点数值范围
码点的整数值范围从 0 到 10FFFF(十六进制表示)。
码点的文本表示法
在书面中引用某个 Unicode 码点时,我们写作 U+ 后接该码点的十六进制表示。例如,大写字母 A 的表示为 U+0041。注意:这种写法仅用于文本中引用码点,并不代表其在内存或文件中的实际字节形式。
Unicode 文本由码点序列组成
要使用 Unicode 字符构成一段文本,需要使用一串 Unicode 码点。例如,码点序列 U+0041 U+0042 U+0043 就构成了文本 ABC。
码点的二进制编码
在字节级别上,Unicode 字符(即码点)的编码方式与其文本表示不同。例如,大写字母 A 在原始字节中并不需要 6 个字节(即 U+0041 这 6 个 ASCII 字符所占的空间)。具体使用的字节数取决于所采用的编码方式(如 UTF-8、UTF-16 等)。
Unicode 平面(Planes)
Unicode 码点被划分为若干个称为 Unicode 平面(planes) 的区域。这些平面的索引从 0 到 10(十六进制),共 17 个平面。
要判断某个码点属于哪个平面,可将其写成 6 位十六进制数字(不足则在前面补零),然后查看前两位十六进制数字。
- 例如,码点
U+0041补零后为U+000041,前两位是00,因此它属于 平面 0。 - 又如,码点
U+10FFFF已经是 6 位十六进制数,前两位是10(十进制为 16),因此它属于 平面 16。
以下是各 Unicode 平面的十六进制前缀及其码点区间(均以十六进制表示):
| 十六进制前缀 | 码点区间 |
|---|---|
| 00 | U+000000 – U+00FFFF |
| 01 | U+010000 – U+01FFFF |
| 02 | U+020000 – U+02FFFF |
| 03 | U+030000 – U+03FFFF |
| 04 | U+040000 – U+04FFFF |
| 05 | U+050000 – U+05FFFF |
| 06 | U+060000 – U+06FFFF |
| 07 | U+070000 – U+07FFFF |
| 08 | U+080000 – U+08FFFF |
| 09 | U+090000 – U+09FFFF |
| 0A | U+0A0000 – U+0AFFFF |
| 0B | U+0B0000 – U+0BFFFF |
| 0C | U+0C0000 – U+0CFFFF |
| 0D | U+0D0000 – U+0DFFFF |
| 0E | U+0E0000 – U+0EFFFF |
| 0F | U+0F0000 – U+0FFFFF |
| 10 | U+100000 – U+10FFFF |
非字符码点(Non-character Code Points)
每个 Unicode 平面的最后两个码点被保留为 非字符(non-characters),不得用于普通文本。
特殊字符(Special Characters)
Unicode 中包含一些不代表可视文本字符的特殊字符,它们通常位于特定的码点区间内。例如:
| 区间 | 描述 |
|---|---|
| U+000000 – U+00001F | 控制字符 |
| U+00007F – U+00009F | 控制字符 |
| U+00DB00 – U+00DFFF | 代理对(Surrogate pairs) |
| U+00E000 – U+00F8FF | 私用区(Private Use Area, PUA) |
| U+0F0000 – U+0FFFFF | 私用区 |
| U+100000 – U+10FFFF | 私用区 |
此外,有些 Unicode 码点本身并不代表独立字符,而是与前一个字符组合以改变其显示形式。例如,带重音符号的字母可以表示为:先写基础字母的码点,再跟一个重音符号的码点。渲染时这两个码点会被合并为一个带重音的字符。
私用区(Private Use Areas) 在 Unicode 标准中未分配任何官方字符。用户可在自己的系统或应用中按需定义这些区域的含义,但需遵循一定的约定以确保一致性。