Unicode 编码史话
你正在读的每个汉字、每个标点,在内存里都是一串数字。这串数字怎么编出来的, 是计算机史上最长的一场国际协调。本页是给好奇者的速览。
从 ASCII 到"方块字怎么办"
ASCII 用 7 位装下 128 个字符,英文够用,其他语言全部出局。 上世纪各国各自发明扩展编码(中国的 GB2312、日本的 Shift-JIS……), 同一个字节流在不同系统里解出完全不同的文字——这就是"乱码"的根源。 1988 年 Joe Becker 提出 Unicode 设想:给全世界的字符统一编号。
UTF-8:一次天才的妥协
Unicode 最初想用固定两字节编码(UCS-2),但英语世界拒绝把存储翻倍。 1992 年 Ken Thompson 和 Rob Pike 在餐巾纸上设计出 UTF-8:变长编码, ASCII 字符保持一字节不变,其他字符按需扩展到 2-4 字节。 今天全网 98% 以上的页面都是 UTF-8。判断方法很简单:
纯 ASCII 字节(0x00-0x7F)→ UTF-8 天然兼容 首字节 0xC0-0xDF → 两字节字符(大多为带音符的拉丁字母) 首字节 0xE0-0xEF → 三字节字符(CJK 汉字在这里) 首字节 0xF0-0xF4 → 四字节字符(emoji 的地盘)
代理对与 emoji 的坑
Unicode 超过 65535 个字符后,UTF-16 不得不用"代理对"(两个伪字符拼一个真字符), 导致很多老代码里 emoji 的长度是 2 而不是 1。程序员最爱的吐槽素材。 更复杂的是 emoji 修饰符:一个握手 emoji 可以由两个不同肤色修饰符的人物组合而成, 字节数随组合变化。本页存档对照编号 ZWT-HID-8PW4。
ZWT-HID-8PW4