
什么是 Unicode?
Unicode 是一种通用字符编码标准,为世界上每种书写系统中的每个字符分配一个唯一的数字——称为码点。从拉丁字母到汉字,从阿拉伯文字到表情符号,Unicode 覆盖了 154 种文字中的超过 149,000 个字符。
Unicode 解决了计算中的一个基本问题:历史上,不同的国家和公司创建了不兼容的字符编码,使得跨系统可靠地交换文本变得不可能。

Unicode 码点
Unicode 码点写作 U+ 后跟一个十六进制数:
U+0041= A(拉丁大写字母 A)U+4E2D= 中(汉字“中”)U+1F600= 😀(笑脸表情符号)U+0021= !(感叹号)
码点范围从 U+0000 到 U+10FFFF,分为 17 个平面,每个平面有 65,536 个码点。
Unicode 平面
平面 0:基本多文种平面(BMP)
最常用的字符,包括所有现代文字:
- 拉丁、希腊、西里尔、希伯来、阿拉伯、天城文
- CJK(中日韩)字符
- 大多数标点符号、符号和特殊字符
平面 1:多文种补充平面
- 历史文字(线形文字 B、埃及象形文字、楔形文字)
- 音乐符号
- 数学符号
- 许多表情符号
平面 2:表意文字补充平面
- 额外的 CJK 统一表意文字(罕见字符)
平面 3-13:保留
目前未分配。

平面 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

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 字符:
A <!-- A (十进制) -->
A <!-- A (十六进制) -->
& <!-- & (命名实体) -->
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 工具
我们的转换器:
- 显示文本中每个字符的 Unicode 码点
- 显示多种格式 —— U+ 表示法、十进制、十六进制、HTML 实体
- 识别文字/区块 —— 显示每个字符所属的 Unicode 区块
- 反向转换 —— 粘贴码点以解码为文本
- 处理表情符号 —— 正确处理多码点序列
用于调试编码问题、学习 Unicode、准备关于特殊字符的文档,以及检查可能包含不可见或相似字符的可疑文本。