正在加载,请稍候…

Unicode 详解:字符、码点与编码

将文本转换为 Unicode 码点。了解 Unicode、UTF-8 以及现代软件如何处理国际化文本。

Unicode 详解:字符、码点与编码

什么是 Unicode?

Unicode 是一种通用字符编码标准,为世界上每种书写系统中的每个字符分配一个唯一的数字——称为码点。从拉丁字母到汉字,从阿拉伯文字到表情符号,Unicode 覆盖了 154 种文字中的超过 149,000 个字符。

Unicode 解决了计算中的一个基本问题:历史上,不同的国家和公司创建了不兼容的字符编码,使得跨系统可靠地交换文本变得不可能。

Unicode 详解:字符、码点与编码 插图

Unicode 码点

Unicode 码点写作 U+ 后跟一个十六进制数:

  • U+0041 = A(拉丁大写字母 A)
  • U+4E2D = 中(汉字“中”)
  • U+1F600 = 😀(笑脸表情符号)
  • U+0021 = !(感叹号)

码点范围从 U+0000U+10FFFF,分为 17 个平面,每个平面有 65,536 个码点。

Unicode 平面

平面 0:基本多文种平面(BMP)

最常用的字符,包括所有现代文字:

  • 拉丁、希腊、西里尔、希伯来、阿拉伯、天城文
  • CJK(中日韩)字符
  • 大多数标点符号、符号和特殊字符

平面 1:多文种补充平面

  • 历史文字(线形文字 B、埃及象形文字、楔形文字)
  • 音乐符号
  • 数学符号
  • 许多表情符号

平面 2:表意文字补充平面

  • 额外的 CJK 统一表意文字(罕见字符)

平面 3-13:保留

目前未分配。

Unicode 详解:字符、码点与编码 插图

平面 14-16:专用补充平面

  • 标签和变体选择符

Unicode 编码

UTF-8

网络上占主导地位的编码(超过 98% 的网站使用):

  • ASCII 字符使用 1 字节
  • 大多数欧洲字符使用 2 字节
  • CJK 字符使用 3 字节
  • 表情符号和补充字符使用 4 字节

UTF-8 向后兼容 ASCII——任何 ASCII 文件都是有效的 UTF-8。

UTF-16

Windows 和 Java 内部使用:

  • 大多数字符使用 2 字节
  • 补充平面字符使用 4 字节(代理对)
  • 不向后兼容 ASCII

UTF-32

固定宽度 4 字节编码。索引简单但内存效率低。某些编程语言内部使用。

编程中的 Unicode

Unicode 详解:字符、码点与编码 插图

JavaScript

JavaScript 字符串内部是 UTF-16。处理补充平面字符时需要小心:

'A'.charCodeAt(0)      // 65 (码点)
'\u0041'               // 'A' (Unicode 转义)
'\u{1F600}'            // '😀' (ES6 扩展转义)
'😀'.length            // 2 (两个 UTF-16 代码单元!)
[...'😀'].length       // 1 (正确的字符计数)

Python

Python 3 字符串是 Unicode 码点序列:

ord('A')           # 65
chr(65)            # 'A'
'\u0041'           # 'A'
'\U0001F600'       # '😀'
len('😀')          # 1 (Python 3 中正确)

HTML

HTML 中的 Unicode 字符:

&#65;       <!-- A (十进制) -->
&#x41;      <!-- A (十六进制) -->
&amp;       <!-- & (命名实体) -->

Unicode 规范化

相同的视觉字符有时可以用多种方式表示:

  • 预组合:é = U+00E9(单个码点)
  • 分解:é = U+0065 + U+0301(e + 组合重音)

Unicode 定义了规范化形式来标准化这些表示:

  • NFC(规范分解后跟规范组合)—— 大多数情况下首选
  • NFD(规范分解)—— 分解形式
  • NFKC/NFKD —— 兼容性规范化

未能规范化可能导致字符串比较错误、搜索失败和安全问题。

特殊 Unicode 字符

一些对开发者有用的 Unicode 码点:

  • U+FEFF —— 字节顺序标记(BOM)/ 零宽不换行空格
  • U+200B —— 零宽空格(不可见,影响断词)
  • U+200D —— 零宽连字(用于表情符号序列)
  • U+FFFE —— 非字符(用于编码检测)
  • U+202E —— 从右到左覆盖(可用于欺骗)

使用文本转 Unicode 工具

我们的转换器:

  1. 显示文本中每个字符的 Unicode 码点
  2. 显示多种格式 —— U+ 表示法、十进制、十六进制、HTML 实体
  3. 识别文字/区块 —— 显示每个字符所属的 Unicode 区块
  4. 反向转换 —— 粘贴码点以解码为文本
  5. 处理表情符号 —— 正确处理多码点序列

用于调试编码问题、学习 Unicode、准备关于特殊字符的文档,以及检查可能包含不可见或相似字符的可疑文本。