Unicode 简介

更新于 2025-12-26

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 码点表示,该码点是一个整数。

码点数值范围

码点的整数值范围从 010FFFF(十六进制表示)。

码点的文本表示法

在书面中引用某个 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) 的区域。这些平面的索引从 010(十六进制),共 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 标准中未分配任何官方字符。用户可在自己的系统或应用中按需定义这些区域的含义,但需遵循一定的约定以确保一致性。