什么是 Unicode
本文约 4 分钟读完。
Unicode 是用一套统一的编号体系来表示全世界文字的国际标准,emoji 也是这个标准的一部分。日语、英语、阿拉伯语、emoji、数学符号 - 通过为所有「文字」分配唯一的编号 (码位), 使得不同语言和系统之间能够正确地交换文本。
定义与目的
Unicode 是由 Unicode Consortium (非营利组织) 制定和管理的字符编码标准。 从 1991 年的 Unicode 1.0 开始,到 2024 年的 Unicode 16.0 已收录超过 15 万个字符。
在 Unicode 出现之前,日语使用 Shift_JIS 或 EUC-JP,中文使用 GB2312,韩语使用 EUC-KR, 每种语言都有不同的字符编码。 这正是「乱码」的主要原因,Unicode 就是为了从根本上解决这个问题而诞生的。
什么是码位
在 Unicode 中,每个字符被分配一个称为「码位」的唯一编号。 表示方式为 U+ 后跟十六进制数,例如:
- A → U+0041
- あ → U+3042
- 😊 → U+1F60A
- 🌸 → U+1F338
码位就像「字符的地址」,在任何系统中,同一个编号都指向同一个字符。
编码 - UTF-8 与 UTF-16
将码位保存到计算机内存或文件中的方法称为「编码」。 主要有两种编码方式。
| 比较项目 | UTF-8 | UTF-16 |
|---|---|---|
| 每个字符的字节数 | 1 至 4 字节 (可变长) | 2 或 4 字节 |
| ASCII 兼容 | 有 (英文数字为 1 字节) | 无 |
| 主要用途 | Web、文件存储、API | Windows 内部、Java、JavaScript |
| emoji 的字节数 | 4 字节 | 4 字节 (代理对) |
在 Web 世界中,UTF-8 是事实上的标准。 HTML 文件中的 <meta charset="utf-8"> 就是在声明「本页面使用 UTF-8 编码」。
Unicode 与 emoji 的关系
emoji 作为 Unicode 的一个「区块」被收录其中。 主要分布在以下区块:
- Emoticons (U+1F600 至 U+1F64F): 面部表情
- Miscellaneous Symbols and Pictographs (U+1F300 至 U+1F5FF): 天气、食物、动物等
- Transport and Map Symbols (U+1F680 至 U+1F6FF): 交通工具、建筑
- Supplemental Symbols and Pictographs (U+1F900 至 U+1F9FF): 补充 emoji
新 emoji 的添加由 Unicode Consortium 的 Emoji Subcommittee 审核,每年发布一次。
什么是 Unicode Consortium
Unicode Consortium 是总部位于加利福尼亚州的非营利组织。 Apple、Google、Microsoft、Meta、Amazon 等大型科技公司作为成员参与其中, 为标准的制定和维护做出贡献。 任何人都可以提交 emoji 提案,审核过程是公开的。
实务注意事项
- 字符计数: 一个 emoji 在 JavaScript 的
.length中可能被计为 2 (代理对) - 数据库: 在 MySQL 中存储 emoji 需要使用
utf8mb4(普通的utf8只支持 3 字节) - URL: 在 URL 中包含 emoji 时需要进行百分号编码
相关术语
- emoji - Unicode 中收录的象形文字
- ZWJ (Zero Width Joiner) - 用于合成 emoji 的控制字符