# 49. Kerning Panic·字谈字串（六）Emoji（再次）拯救世界

内核恐慌 · 2018-01-09

<https://lib.pan.icu/1d5fb5fe-b335-4de8-9efb-5b205d92af86>

本期《内核恐慌》与《字谈字串》串台节目深入探讨了Emoji背后的 Unicode 技术细节。主持人吴涛、Rio 与嘉宾 Eric 从 UTF-16 的历史遗留问题讲起，解释了代理对（surrogate pair）如何使 UCS-2 扩展为变长编码，以及 Emoji 因位于基本多文种平面之外而迫使旧系统完善支持。随后分析了彩色字体的多种实现——Apple 的 sbix（内嵌 PNG）、Google 的 CBDT/CBLC、Microsoft 的 COLR/CPAL 以及 Adobe/Firefox 的 SVG 方案。节目还介绍了文本与 Emoji 形态的切换机制：语言标签（Zsye/Zsym）、区域扩展（-em）和变体序列（VS15/VS16），并展示了组合序列（如键帽）、修饰序列（肤色）和旗帜序列（国家代码组合）如何通过多个码位合成一个可见 Emoji。最后讨论了字位簇（grapheme cluster）的定义与删除行为，并提及 Twitter 字符计数规则（Emoji 计为2字符、URL 固定长度）背后的权衡。

## Questions this episode answers

### Emoji 如何推动了对 UTF-16 代理对的支持，甚至被说成“拯救世界”？

Eric 和吴涛解释，Emoji 的码位大多在基本多文种平面之外，必须用 UTF-16 的代理对表示。以前像 Java、JavaScript、Windows API 等对代理对的支持常有 bug，但因为罕用而没人修。Emoji 普及后，大量应用必须正确显示这些字符，倒逼环境修复了代理对相关的缺陷，因此有人戏称“Emoji 拯救了世界”。

[11:43](https://lib.pan.icu/1d5fb5fe-b335-4de8-9efb-5b205d92af86?t=703000)

### 彩色 Emoji 字体在技术上是怎样实现的？有哪些不同方案？

Eric 和吴涛列举了当前主流方案：Apple 在 TrueType 中通过私有 SBIX 表嵌入 PNG 位图；Google 的 Noto 使用 OpenType 的 CBDT/CBLC 表存放位图；Microsoft 的 COLR/CPAL 分色层叠加，可兼容传统轮廓；Adobe 和 Firefox 则推行基于 SVG 的矢量格式，支持渐变。各方案各有优劣，但都让字体文件承载了彩色图形。

[25:37](https://lib.pan.icu/1d5fb5fe-b335-4de8-9efb-5b205d92af86?t=1537000)

### 怎样让同一个 Unicode 字符分别显示为文本符号和 Emoji 图案？

Eric 和吴涛介绍了三种手段：一是在语言标签里用 Zsye（Emoji 样式）或 Zsym（文本样式）声明；二是用 locale 扩展如 en-US-em；最实用的做法是在字符后追加变体选择符 VS-15（U+FE0E，强制文本）或 VS-16（U+FE0F，强制 Emoji）。不加指定时，不同平台（比如 iOS 偏向 Emoji）会给出不一致的呈现。

[35:33](https://lib.pan.icu/1d5fb5fe-b335-4de8-9efb-5b205d92af86?t=2133000)

### 为什么在输入框里删除 Emoji 时，有时会一下删掉整个符号，而不是一个字符？

吴涛以“数字键帽”为例解释：由多个码位合成的 Emoji 在 Unicode 中被定义为“字位簇”（grapheme cluster），必须当作一个单元。删除时，整个簇会被一起移除。这个机制本来是为泰文、韩文等复杂文字设计的，确保编辑时不会拆散一个字的部件，但在 Emoji 上经常让用户感到意外。

[1:07:41](https://lib.pan.icu/1d5fb5fe-b335-4de8-9efb-5b205d92af86?t=4061000)

## Key moments

- **[0:00] 开场闲聊**
  - [0:27] 《字谈字串》与《内核恐慌》第6次串台，四位主播祝贺新年，分享假期经历。
  - [1:04] 吴涛在瑞士滑雪赶上仅有的2个好天气，回来后下雨雪被冲毁。
  - [1:40] Eric时隔三年回老家翻族谱，找到字辈诗“巩俐国家生死一生”，调侃太强硬。
- **[4:21] 新闻**
  - [4:21] 古德龙·察普夫夫人百年诞辰，其字体Hesse Antiqua被数码化，仅含大写及小型大写字。
  - [8:28] ISO/IEC 10646:2017在圣诞前夜发布，与Unicode 10.0同步，成为国际标准。
- **[10:01] 代理对与UTF-16**
  - [10:26] 上次Emoji串台节目好评率最高，因此本期再深入Emoji背后的技术。
  - [11:07] Emoji常用码位位于第一平面，迫使各环境修复UTF-16代孕对（Surrogate pairs）的支持漏洞。
  - [12:35] Java、JavaScript和Windows API早期基于UCS-2，不支持UTF-16变长，处理Emoji时常出错。
  - [14:42] UCS-2是UTF-16的子集，UCS-4等价于UTF-32；UTF-8因其无歧义和可自纠错适合存储传输。
  - [15:26] 基本多文种平面仅65536个码位，UCS-2固定双字节不够用，UTF-16通过代孕对变长扩展。
  - [16:40] “Surrogate 这个词最常见的不就是代孕吗？我自己干不出来，所以要找别的东西来帮我把这个字符‘生’出来。”
- **[24:23] 彩色字体**
  - [25:25] Emoji字体默认为彩色，安卓Noto和苹果Apple Color Emoji均内嵌PNG位图，而非传统矢量轮廓。
  - [26:44] Adobe和Firefox主导OpenType SVG彩色矢量字体，Photoshop和Illustrator已支持矢量Emoji。
  - [28:19] 微软CPAL彩色字体技术：用分色层矢量轮廓叠加，不需渐变，容易兼容传统单色字体。
  - [33:29] “这印证了中国那句古话，书画不分家。”
  - [33:42] Emoji进Unicode引发争议，被比喻为潘多拉盒子，Unicode想把所有可见物都编码。
- **[35:14] 文本与Emoji形态**
  - [35:33] 部分符号同时有文本和Emoji形态，如箭头，需通过VS15/VS16或语言声明指定。
  - [36:36] Unicode定义语言代码Zsye（Emoji形态）和Zsym（文本形态），Emoji成为一门可声明的“语言”。
  - [45:23] 使用变体序列VS15（U+FE0E）强制文本，VS16（U+FE0F）强制Emoji，比语言声明更精细。
  - [46:53] 因缺少VS，返回箭头符号在iOS Safari上错误显示为Emoji，源于苹果为秀Emoji字体违背标准。
- **[52:31] 合成Emoji**
  - [52:56] 键盘数字Emoji是组合序列：数字1码位加键帽码位（U+20E3）合成，显示为一个字，背后两个码位。
  - [53:42] 肤色修饰符基于Fitzpatrick六种程度，可作用于人、手等Emoji，圣诞老人可用但梅花鹿不可用。
  - [56:26] 国旗Emoji至少由三个码位构成：一个空旗码位加两个区域指示符，如中国国旗是旗+CN。
  - [57:50] 家庭Emoji用零宽连接器ZWJ组合，两男一孩的家庭Emoji背后实际含五个码位。
  - [1:00:30] Emoji Tag序列草案（UTS #52）可加头发颜色、方向等标签，已被撤回但部分实现已出。
  - [1:01:21] 通过标签可实现金黄头发男孩甚至秃头Emoji，展示Emoji未来方向的无限可能。
- **[1:07:30] 字位簇**
  - [1:07:30] 字位簇（Grapheme cluster）定义人眼所见一字对应多个码位，影响删除、选择和字符计数。
  - [1:09:58] 键帽Emoji的删除bug：输入数字+键帽+空键帽后删除，会连带整个键帽集群一起删除。
  - [1:14:06] Twitter将英文推文字符上限扩至280，但中日韩仍为140，反映西方中心主义忽略信息密度。
  - [1:16:05] 短信160字上限源于德国人在杜塞尔多夫的研究，他测试得出160字满足90%德语短信需求。
  - [1:17:31] Twitter中一个Emoji按两个字符计算，因此只能发140个笑脸，不能发280个。
  - [1:24:27] Emoji普及迫使Unicode改进国旗字符簇定义，从8.0到9.0改为偶数个国旗不再视为一字。
- **[1:27:56] 结尾**

## Speakers

- **Rio** (host)
- **吴涛** (host)
- **Eric** (guest)

## Topics

绘文字

## Mentioned

Adobe (company), Google (company), 微软 (company), 苹果 (company), Apple Color Emoji (product), Firefox (product), Illustrator (product), Java (product), JavaScript (product), Mac (product), Noto Color Emoji (product), Photoshop (product), Python (product), Ruby (product), Safari (product), Twitter (product), Windows (product), iOS (product), line (product), 安卓 (product)

## Transcript

### 开场闲聊

**Eric** [0:18]
大家好 ， 今天是 2018 年 1 月 9 号 ，《 字谈字串 》 的第 64 期 。

**吴涛** [0:24]
呃 ，也是 《 内核恐慌 》 第 549 期 。

**Eric** [0:27]
这是 《 字谈字串 》 与 《 内核恐慌 》 的串台的第 6 期 。《 字谈字串 》 呢 ，是全球首家用华语制作的字体排印主题播客节目 。

我是主播 ， 文川西办东营区 Eric。

**Rio** [0:38]
我是主播黄浦江边秦振宇 ， 钱振宇 。

**吴涛** [0:42]
呃 ， 您正在收听 IT 技术与娱乐节目 《 内核恐慌 》。 我们号称 "Hardcore"，但是没有干货 ； 想听人听 ，不想听就别听 。

我是吴涛 。

**Rio** [0:51]
我是 Rio。

**Eric** [0:52]
太好了 ， 我们又来串台了 。2018 年新年快乐 。

**吴涛** [0:57]
啊 ， 新年快乐 。

**Eric** [0:58]
怎么样 ， 你在 ——

**吴涛** [0:59]
今年挺好 。

**Eric** [1:00]
吴涛 ， 你在瑞士滑雪还开心吗 ？

**吴涛** [1:04]
嗯 ， 挺好的 。 这 、 这次滑得非常爽 ，而且我们赶上了仅有的 2 个好天气 。 然后回来之后就完全完蛋了 ， 下雨了 ， 把那个雪都冲得乱七八糟的 。

**Eric** [1:16]
哈哈哈 。

**吴涛** [1:16]
你们怎么过的 ？

**Eric** [1:17]
我回家了 。 我好久没回家了 。 嗯 ， 我时隔 3 年回到了文川西办 。

**吴涛** [1:24]
哦 ， 恭喜 。

**Eric** [1:25]
你说 " 查祖谱 "， 查得怎么样 ？ 认祖归宗 ？

**吴涛** [1:31]
衣锦还乡 。

**Eric** [1:33]
我不发推了嘛 ， 就是 。 因为我 、 我上次看那个族谱是我高中的时候嘛 ， 特地这次又去重新再翻出来 。

原来我们那个是一个箱子 ，12 本 ， 然后 —— 但是里面大概就是四五本都是人的名字嘛 ， 家 、 家谱嘛 ， 然后 ——

**吴涛** [1:50]
家谱都是这样的 ， 对 。

**Eric** [1:51]
四五本都是那个坟墓 ， 就是祖先的坟在哪座山里面 ， 都 、 都是那些东西 。 然后只有真正实质性的东西就是只有 2 本 。

嗯 ， 然后就翻了一下家里的什么名声啊 ， 什么乱七八糟的 。 我终于查到了我们老家那个字辈 。

就是你们有字辈吗 ？ 就起名字的时候 。

**吴涛** [2:11]
有 。

**Eric** [2:12]
你应该排 ， 你应该是排什么辈分 ？

**吴涛** [2:14]
我爸是玉字辈 。

**Eric** [2:15]
嗯 ， 就是排一个字辈嘛 。 然后我们那个字辈 ， 理论上讲应该是可以编成一首诗的 ， 就是那样子的 。

我 、 我终于查到了那首诗 。

**吴涛** [2:23]
哦 。

**Eric** [2:24]
巩俐国家生死一生 。

**吴涛** [2:27]
哈哈哈 。

**Eric** [2:29]
不用这么强硬的 ， 好吧 。

**吴涛** [2:31]
其实没有你想象的那 、 那么高端 。 然后就是什么 " 李易传家宝 "、" 诗书玉后珍 " 之类的 ， 就 、 就那种东西 。

**Eric** [2:39]
哦 ，OK。

**吴涛** [2:40]
嗯 ， 好吧 。

**Eric** [2:40]
哎 ，但你是单名啊 ， 所以你就不按那个来起名字了 。

**吴涛** [2:44]
对 ， 我们这一辈 ， 咱们这一代其实全都没有了 。

**Eric** [2:47]
你说 。

**吴涛** [2:47]
就大部分都没有了 。

**Eric** [2:48]
你就说有 、 有这样的一个规定 ，但是你是不是按这个规定起 ， 那就是各 、 各家各房 ， 就是不一样的 。

**吴涛** [2:55]
哦 ， 所以 Rio 你是光字辈的 ？

**Eric** [2:57]
对啊 。

**吴涛** [2:58]
哇哦 。

**Eric** [2:59]
哇 ， 你们都是那个名门出身 。 我连 、 我连我 —— 就我爷爷那边往上数三辈就没有 ， 就不知道谁是谁了 。

**吴涛** [3:08]
哈哈哈 。

**Eric** [3:09]
你是真字辈 ， 下 、 下一辈应该是主的 、 闸的 。

**吴涛** [3:13]
哈哈哈 。

**Eric** [3:14]
好了 。

**吴涛** [3:15]
哈哈哈

。

**Eric** [3:19]
等一下， 那个什么烹饪方法 ， 那个顺序怎么来着 ？

**吴涛** [3:21]
酱爆字辈 。

**Eric** [3:23]
从 、 从 、 从草字开始吗 ？

**吴涛** [3:25]
哈哈哈 。

**Eric** [3:27]
古老字辈 。

**吴涛** [3:29]
还是 。

**Eric** [3:29]
哈哈哈 。

**吴涛** [3:31]
阿拉 ， 就是说阿拉 Hong Kong， 阿拉四川 ， 阿拉四川字辈 。OK。

**Eric** [3:38]
啊 ，不扯了 。 振宇 ， 新年怎么过的 ？

**Rio** [3:44]
呃 ， 我 、 我就在上海附近 ， 我元旦去了下杭州 。 对 ， 我就参观了一下 。 我去参观一下中国美院传说中王树先生的那个作品群 。

**吴涛** [3:55]
哦 ， 那个建筑是吧 。 哎 ， 中国美院建筑好像挺有名的 。

**Rio** [3:58]
对 ， 就是那个象山校区的 ，是王树的作品群 。 整个校区都是他一手搞的 。

**吴涛** [4:05]
啊 。

**Eric** [4:06]
Rio 就一直待在深圳吗 ？

**Rio** [4:09]
对 ， 春节 ， 呃 ， 新年就是在家里休假嘛 。 因为上个月 ， 就 12 月都一直在出差 ， 挺累的 ， 然后就在家里休息了一段时间 。

**Eric** [4:18]
好吧 。

### 新闻

**Eric** [4:21]
那看来大家休息得挺好 。 嗯 ， 我们这里的话 ，因为是串台节目嘛 ， 就不说太多的新闻了 ，但是我还是忍不住想说一 、 呃 ， 两条 。

一条呢 ，是古德龙 · 察普夫老奶奶的字体终于被数字化了 。 大家知道察普夫先生哈 ，但是呢 ， 察普夫夫人其实也是一位特别有名的书法家 。

呃 ， 她的名字其实叫古德龙 · 察普夫 · 冯 ·Hesse。Hesse 其实是她的 ， 就是娘家姓是吧 ， 应该 。

**吴涛** [4:52]
啊 ， 如果她有贵族封地 ， 她有贵族头衔的话 ， 很有可能是会 、 会延续下来的 。

**Eric** [4:57]
啊 。

**吴涛** [4:59]
因为 。

**Eric** [4:59]
就不管是男女 ， 哪怕结了婚也会延续 。

**吴涛** [5:02]
嗯 。

**Eric** [5:03]
她呢是 1918 年的 1 月 2 号的生日， 所以呢 ， 她刚刚迎来她的百年诞辰啊 。 然后为了庆祝她的百年生日呢 ， 呃 ， 她的那款新字体呢 ， 终于 ， 啊 ， 她的那款字体呢 ， 终于被 ， 呃 ， 数码化了 。

这个字体的名字就叫 Hesse Antiqua。 德语里面这个 Antiqua 是 ， 就相当于那个称心体的意思还是 ？

**吴涛** [5:27]
就是 ， 就 、 就是古典体 。Antiqua 这个词就是古典 。

**Eric** [5:31]
Antique。

**吴涛** [5:31]
对 ，Antique。

**Eric** [5:32]
古典 。

**吴涛** [5:32]
嗯 。

**Eric** [5:33]
然后大家可以去看一下我们那个链接哈 ，在 FontShop 里面 。 呃 ， 这次负责这个数码化的这位小帅哥呢 ， 叫 Ferdinand Ulrich。

我刚好 10 月份的时候碰到他 。 因为我那时候 。

**吴涛** [5:51]
费迪南德是吗 ？

**Eric** [5:52]
费尔迪 、 费尔迪南德 · 乌尔里希是吧 ， 应该是 。

**吴涛** [5:58]
Ulrich。

**Eric** [5:59]
嗯 。

**吴涛** [6:00]
Ferdinand Ulrich。 念起来比较扯 。 有点难念了 。

**Eric** [6:05]
对对 ，Ulrich。 呃 ，他现在正在那个雷丁读博士学位 ， 一直跟着那个 Eric· 施皮克曼 。 啊 ，在那个就是活字印刷的工作室 ， 叫叫 P-98A。

柏林就是我们 10 月份 Type tour 和你之前跟一起去参 、 去访问 P-98A 的时候 ， 刚好他在这个工作室里面 ， 所以他带我们到公司走了一圈啊 。

**吴涛** [6:31]
哦 ，OK。

**Eric** [6:32]
嗯 。

**吴涛** [6:32]
感觉如何 ？

**Eric** [6:33]
啊 ， 特别好 。 嗯 。 然后他本人是一个 ， 哇 ， 身材特别高大 ， 将近 2 米吧 ， 我估计他的身高 。

**吴涛** [6:41]
真的 ？

**Eric** [6:41]
嗯 ， 对对对 ， 个子特别高 。 哎 。 呃 ， 然 、 嗯 ， 那时候他刚开完会回来嘛 ， 特别特别困 ，但是呢 ，也 、 哈哈哈 ，并呢 ， 这个疲劳的身躯还带我们进去 ， 呃 ， 看了一下 。

因为他那个工作坊呢 ， 更多的是那个木活字 ， 就是相对来讲比较大的那个活字 。 大家知道嘛 ，在欧洲的话 ， 小的 、 小的签字的话是用金属的 ， 那大 、 大的都是用木活字 。

那他们在那边印了很多什么海报啊 ， 什么什么的 。 嗯 。

**吴涛** [7:12]
OK。

**Eric** [7:12]
好 。 那这款字呢 ， 已经在线上了 ， 所以大家有空可以去看一下 。 呃 ， 非常符合这 ，因为古德龙 · 察普夫夫人她本人是 ， 本人是书法家嘛 。

嗯 ， 可以看一下 ，其实很有那个 De'Toulouse 嘛 ， 就是她原来第一款那个字体的感觉 。 那这次的复刻出来的数码版呢 ，也是没有小写字母啊 ， 只有大写字母和小型大写字母 。

这样拍出来非常古典的感觉 ， 就非常符合这个 Antiqua 这个名字 。

**吴涛** [7:47]
所以是他 、 他 、 他开始做这个字体就是拿来做 、 做展示用的是吗 ？

**Eric** [7:54]
对 。

**吴涛** [7:56]
OK。

**Eric** [7:56]
雕刻的是吗 ？ 什么碑文字体感觉像 。

**吴涛** [7:59]
对 ， 对 。

**Eric** [8:02]
这款字它字体其实当年很早了 ， 就是原来是有签字版本的 ，但是呢 ， 就一直都没有这个数码版 。

**吴涛** [8:12]
嗯 ， 明白了 。

**Eric** [8:14]
嗯 。 那我们在此呢 ，也遥祝察普夫夫人身体健康 。

**吴涛** [8:19]
嗯 。

**Eric** [8:20]
好 。

**吴涛** [8:21]
活 100 岁 ， 可以继续活下去 。

**Eric** [8:23]
对啊 。

**吴涛** [8:23]
一定要好好活下去 。

**Eric** [8:24]
一定要好好活下去 。

好 ， 下面一条消息呢 ， 就热烈庆祝新版的 ISO/IEC 的 10646 发布啦 。 这次发布的时间呢 ， 特别有意思 ，是在 12 月的 24 号 ，也就是圣诞前 、 前夜 。

那这次发布的是第 5 个版本 。其实这次发布的一个目的 ， 就是为了和半年前呢发布的那个 Unicode 10.0 的版本进行一个同步 。

如果有收听我们上一次就是 ， 嗯 ， 梁海来参加的那期 Unicode 和大家介绍 Unicode 的节目 ， 就知道 Unicode 和这个 ISO 的 10646 呢 ，是有一个非常复杂的一个同步的关系 。

啊 ， 两 、 呃 ， 两个 、 两个文 ，因为两个文件是分别是两个组织 ， 所以呢 ， 它们并不是同步的 。 嗯 ， 那 Unicode 呢 ，是事先 ， 呃 ，10.0 就已经在大半年前就已经发布了 。

那这次呢 ， 就是落实到 ISO， 落实到 ISO 的 10646 发布以后， 这个就是变成 ，因为 ISO 是国际标准组织 ， 呃 ，不 、 不 ， 国际标准组织嘛 ， 那这个新的标准就是 ， 就是官方性的 ， 就会要由就各国的标准化组织继续的来接受和在各国里面执行 。

**吴涛** [9:44]
OK。

**Eric** [9:45]
嗯 。 那实际 、 实际内容其实就是跟那个 Unicode 10.0 是差不多的 。 嗯 ，有一些细 、 细微的不同 ，但是我觉得已经没有必要在节目里面讲了 。

啊 ，有兴趣的同学可以去看文档 。 好 。

那好吧 ， 那我们是不是赶快可以进入正题了 ？

### 代理对与UTF-16

**吴涛** [10:06]
嗯哼 。 咱们捧哏要热情一点好吗 ？

**Eric** [10:10]
对呀 。

**吴涛** [10:11]
哈哈哈 。

**Eric** [10:13]
你们都睡着了吗 ， 同学们 ？

**吴涛** [10:15]
新年第一次捧哏 ， 你们这么 。

**Eric** [10:17]
不是 ， 今天 、 今天有 3 个捧的 ，3 个捧的都在互相哏 。 好吧 。 呃 ， 今天我们的主题是 "Emoji 再一次拯救了世界 "。

哎 ，其实哈 ， 去 、 呃 ， 上次我们 、 我们其实这个字谈字串节目啊 ， 呃 ， 今天也是第 6 期了 。 但是呢 ， 就是目前为止 ， 就是收听率和这个 、 这个好评最高的 ， 还是那期关于 Emoji 的那期 。

**吴涛** [10:42]
所以大家还是 ， 虽然看不到 Emoji 本身 ， 还是会希望在会很喜欢的 Podcast 里面听到这些事情 。

**Eric** [10:49]
对 。 但是呢 ，其实上次呢 ， 我们也是觉得时间不够嘛 ， 然后 Emoji 其实背后还有很多更多的那个技术方面的东西还没有跟大家聊透 。

所以呢 ， 我们今天决定再花一期的时间和大家聊 Emoji 背后的一些技术的内容 。

**吴涛** [11:07]
嗯 。

**Eric** [11:07]
嗯 。 那首先呢 ， 就是要跟大家扯一扯就是那个 Surrogates、Payers 的事情 。 这个东西 ， 呃 ， 就中文叫什么 ？ 代理队是吗 ？

**吴涛** [11:19]
对 。 呃 ，不知道怎么翻 ， 就姑且这么翻译吧 。

**Eric** [11:22]
嗯 。 你直译的话 ，Surrogate 就是代理嘛 ，Payers 就是队嘛 。

**吴涛** [11:26]
嗯 。

**Eric** [11:26]
就 Surrogate， 呃 ，Surrogate Payers。 呃 ，因为最近哈 ， 就是在日本有人写了文章 ， 就 、 就讲说 ， 哎呀 ， 感谢 Emoji 加速了这个很多环境对这个代理队的支持 。

因为说实话 ，以前就是一直都有这个东西 ，但是呢 ， 很多环境都支持得不好 。 而且呢 ，但是因为它并不是非常常用 。

啊 ，因为如果你要使用这个代理队 、 代理队的那些字啊 ， 就是 Unicode 那些字啊 ， 就是你放在 UTF-16 都是很后面 ， 就 、 就非常罕用的那些字 。

所以呢 ， 即使你有 bug， 大家也不去修 。 然后呢 ， 或者说有些 bug 根本就没有体现出来 。 结果现在呢 ，Emoji 大家经常常用了 ， 大家发现 ， 哎呦 ， 我 、 我 、 我要赶快去能 support， 就支持 Emoji， 才发现 ， 哎 ， 这一些乱七八糟东西都翻出来了 。

所以我觉得还是有必要和大家再讲讲这个 ， 呃 ，UTF-16 和这个 Surrogate， 呃 ， 这个代理队的事情 。

**吴涛** [12:35]
OK。

**Eric** [12:36]
嗯 。 因为最早来讲的话 ， 就首先 Java、JavaScript 和那个 Windows 的 API 首先好像原来都不支持 ， 都不支持吧 ？

**吴涛** [12:46]
因为最开始的时候是没有 UTF-16 的 ， 最开始用的是那个 UCS-2， 就是最开始 ， 就那个是早于 Unicode 标准的 。

**Eric** [12:54]
嗯 。

**吴涛** [12:55]
所以 。

**Eric** [12:56]
实际上是个历史遗留问题嘛 。

**吴涛** [12:58]
对 。 就是在 Unicode 正式这个标准出现之前 ， 当时就已经有这么一个需求 ， 就是说要表 、 表达多个文字了嘛 。

**Eric** [13:07]
嗯 。 就是对于宽字节的需求导致那个 ，其实跟 GBRC2 那个历史源 、 源流是一样的 。

**吴涛** [13:14]
对对 。 对 ， 就实践早于规范 。

**Eric** [13:17]
对 。

**吴涛** [13:18]
所以就 。

**Eric** [13:18]
Windows API，Windows API 直到现在都是两套 ， 一套是宽 、 宽字节的 API， 一套是窄字节的 API。 一个是 ， 一个 W 结尾 ， 还是另外一个是 、 是 C 结尾吧 ， 分别代表 wide 和 character 好像 。

**吴涛** [13:34]
嗯 。 哎 ， 这个宽字节这个词是不是 Windows 他们用的这个术语啊 ？

**Eric** [13:41]
对 。 所以就 、 就是就像我刚刚 API 的那个 ， 就如果有一个 API， 比如说这个 API 叫 OpenWindow， 然后这个 API 它只实际上只是一个 ， 这个函数名实际上是虚的 ， 然后它实际的实现有两个 ， 一个是 Window、OpenWindow， 比如说 underline C， 然后这个就是用 ， 这个就是标准的 ASCII 的 。

然后另外一个是 OpenWindow_W， 然后这个 W 代表 wide， 就是 wide， 就是 、 就是宽字节 。 甚 、 甚至什么 Python 之类的也是 ， 我不知道是不是受到影响 ，也有一个什么宽字节版本 ， 或者是 。

**吴涛** [14:15]
呃 。

**Eric** [14:17]
指的是 。

**吴涛** [14:18]
对 。

**Eric** [14:18]
那个 。

**吴涛** [14:18]
它那个 Python 2 的时候 ， 它是可以让你编译的时候选是默认是 UCS-2 还是 UCS-4。

**Eric** [14:25]
对 。

**吴涛** [14:25]
嗯 。

**Eric** [14:26]
嗯 。 所以呢 ， 现在就其实还是要跟大家整理一下吧 。 就是首先呢 ，是有 UCS-2、UCS、 呃 ，UCS-4， 对吧 ？ 然后呢 ， 这头呢 ，有 UTF-8、UTF-16 和 UTF-32。

**吴涛** [14:42]
对 。

**Eric** [14:42]
对 。

**吴涛** [14:43]
对 。 然后它们的对应关系是 UCS-2 是 UTF-16 的一个子集 。

**Eric** [14:49]
嗯 。

**吴涛** [14:49]
然后 UT、UCS-4 是和 UTF-32 是等价的 。

**Eric** [14:54]
是吧 ？

**吴涛** [14:54]
嗯 。

**Eric** [14:55]
呃 。

**吴涛** [14:56]
对 。

**Eric** [14:56]
然后 UTF-8 是另外一个东西 。

**吴涛** [14:58]
另外一个东西 。 对 。

**Eric** [15:00]
呃 ， 就是很早很早以前都是单字节 ， 后来发现单字节不能用了 ， 就大家用双字节 。 然后 UC、UCS-2 是固定双字节 ， 对吧 ？

**吴涛** [15:10]
对 。

**Eric** [15:11]
对 。 嗯 。 固定的 。 啊 ， 所有东西都是用两个字节来表示 ， 呃 ， 双字节表示 。 结果发现这肯定不够用啊 。

呃 ， 所以把这个 UCS-2。

**吴涛** [15:20]
他们以为够了 ，但其实 。

**Eric** [15:22]
其实不够用 。

**吴涛** [15:23]
怎么可能够用 ？ 你想 。

**Eric** [15:25]
硬件历史 。

**吴涛** [15:26]
对啊 。

**Eric** [15:26]
硬件历史失败了 。

**吴涛** [15:27]
2 的 16 次方的话 ， 才 、 才多少 ？ 才 65,536 吧 。

**Eric** [15:32]
65,000 多个 。

**吴涛** [15:34]
啊 。 所以这个就所谓的我们就是在 Unicode 里面就排 、 摆位置的话 ， 就是那个基本多文种平面嘛 。 啊 。

**Eric** [15:41]
嗯哼 。 对 。

**吴涛** [15:42]
呃 ， 所以在那年、 那时候的才 1991 年的时候 ， 这 、 这就所谓的我们第 0 平面嘛 ， 平面它分 0、1、2、3、4、5 好多个面嘛 ， 第 0 个平面 ， 最基本的那个面 ， 那才 6 万多个码位 ， 肯定是不够用的呀 。

但是呢 ， 当时觉得够用 ， 然后呢 ， 就用了一个固定的双字节的 ， 就我们现在叫的 UCS-2。 然后发现不够用了怎么办呢 ？

就是拿去扩展 ， 这个扩展就特别 、 特别坑 ， 就开始用了一个 UTF-16。 这是它是个变长的 ， 对吧 ？

**Eric** [16:15]
呃 。

**吴涛** [16:15]
UTF-16 是 。

**Eric** [16:18]
大部分是定长的 。

**吴涛** [16:19]
对 ， 大部分是定长的 。 它可以变长 。

**Eric** [16:22]
就它的我们常用那部分就是 UCS-2 嘛 ， 就是定长两个字节 。 但是它留了一个刚才讲那个 Surrogate、Payer 代理队的方式 。

**吴涛** [16:30]
嗯 。

**Eric** [16:30]
来支持一个扩展 ， 然后让它变成一个更长的支持 。

**吴涛** [16:34]
Surrogate、Surrogate 主要是代孕嘛 ， 就是我需要这个东西 ， 然后我需要这个东西 ，但是我自己 。

**Eric** [16:40]
啊 ， 包起来 。

**吴涛** [16:41]
我自己干不出来 ， 所以我要找 、 找别的东西来

帮我生出来 ， 这种感觉 。

**Eric** [16:49]
为什么被你说得那么奇怪 ， 听起来 。

**吴涛** [16:53]
Surrogate 这个词就因为它 、 它没有用 agent 或者是 ， 呃 ，broker 之类这样一个词 ， 它用 surrogate。 这个 surrogate 这个词最常见的不就是代孕吗 ？

**Eric** [17:02]
嗯 。

是的 。 呃 ，因为呢 ， 我们大部分常用的 Emoji 就是比如说大家想象的就是比如说那个脸蛋 、 笑脸啊 ， 那些 Emoji 原来排的码位都不在这个基本多文种平面 ，而都在第 1 平面上 。

所以呢 ， 如果按那个 Unicode 码位的话 ， 大家就可以看都是在 100000， 啊 ， 就 、 就 5 位数了都已经 ， 就是 。

**吴涛** [17:31]
嗯 。

**Eric** [17:32]
嗯 。 因此呢 ， 如果用普通的那个 UCS-2 是没办法弄的 ， 要两 、 两 、 双字节是没办法弄的 ， 那就要用变长 。

那在 UTF-16 里面呢 ， 就要通过这个代孕的 Surrogate、Payers， 就代理队去用这个临时的两个组合去给它拓展成 ， 呃 ， 就是这 、 这 、 这也不叫拓展 ， 这叫什么呀 ？

就代替成 ， 就是换成其他的那个代码 ， 用两个字节加起来 。

**吴涛** [18:10]
狸猫换太子 。

**Eric** [18:11]
嗯 。 对啊 。 所以这样就说 ， 当它这个字这个码位是在基本文 ， 呃 ，在基本的多文种平面的话 ， 它就直接用 ， 它就不用这样搞来搞去的嘛 。

就是超过这平面了 ， 它没办法弄了 ， 所以它就开始用代理队了 。

**吴涛** [18:27]
对 。

**Eric** [18:27]
嗯 。 所以这样一个结果就变成 UTF-16 的话 ， 它就是一个变长的东西嘛 。 它可能是单字节 ，也可能是双字节 ，也可能是四字节 ， 如果你要用后面那些超 、 超过那些基本文明范围的东西 。

结果呢 。

**吴涛** [18:41]
对 。

**Eric** [18:41]
Emoji 全部都是超过范围的 。 所以你用 ， 如果你想用 Emoji 的码位 ， 那你编码如果又都是 UTF-16 的话 ， 你就必须要用这个代理队 。

**吴涛** [18:52]
对 。

**Eric** [18:53]
嗯 。 然后所以代理队他们 、 他们就一直讲啊 ， 那 UTF-16 为什么要搞个这么复杂的机制 ？

**吴涛** [19:01]
它不是 ， 它这个复杂性是来自于历史的嘛 。 它 、 它不是一开始就要想 。

**Eric** [19:06]
它本来就不想的嘛 。

**吴涛** [19:07]
嗯 。

**Eric** [19:07]
它本来就是 。

**吴涛** [19:08]
就是搞了 UCS-2 觉得够用了 ， 然后不够用就只能修修补补 ， 又不能大改吧 ， 就只能在 UCS-2 上多做文章 ， 搞出这么一个混合的一个东西 。

**Eric** [19:18]
对 ， 一个怪胎来 。

**吴涛** [19:19]
而且我觉得这个还会有个问题啊 ， 你说到现在这个 Emoji 这个帧数哈 。

**Eric** [19:24]
嗯 。

**吴涛** [19:24]
我觉得四字节很快也不够用了吧 。

**Eric** [19:27]
四字节不至于吧 ， 我觉得 。

**吴涛** [19:29]
四字节够用 。

**Eric** [19:30]
嗯 。 应该够用 。

**吴涛** [19:31]
四字节也就多少 ？ 也就才 。

**Eric** [19:33]
也就才 。

**吴涛** [19:34]
四字节很多了 。

**Eric** [19:35]
够啊 。

**吴涛** [19:35]
够啊 。

**Eric** [19:35]
因为这是那个密啊 。

**吴涛** [19:37]
所以还好 。

**Eric** [19:39]
还早是吧 ？

**吴涛** [19:40]
嗯 。

**Eric** [19:40]
还早着呢 。

**吴涛** [19:41]
嗯 。

**Eric** [19:42]
好吧 。 所以但是如果用 ， 大家都用那个 UCS-4 和或者都用那个 UTF-32 的话 ， 就所有的东西都用四字节 ， 多好浪费嘛 ，不是 ？

**吴涛** [19:54]
嗯哼 。

**Eric** [19:56]
对 。 就是 。

**吴涛** [19:58]
所以大家想来想去 。

**Eric** [19:59]
对 。

**吴涛** [19:59]
大家还是用 UTF-8 吧 ， 大家都来用 UTF-8 吧 ， 这个世界多美好 。

**Eric** [20:04]
其实 UTF-8 也 、 也 、 也比较浪费啊 ， 如果你真要揪这个的话 。

**吴涛** [20:09]
那对我们中国人来讲是比较浪费 。

**Eric** [20:10]
嗯 。

**吴涛** [20:11]
UTF-8 最大的优势是比较灵活吧 ， 我觉得 。

**Eric** [20:15]
嗯 。

**吴涛** [20:16]
它就在 、 它就在的优势是没有歧义 。

**Eric** [20:19]
对 。

**吴涛** [20:19]
就是它可以随意 。

**Eric** [20:20]
嗯 ， 知道是 。

**吴涛** [20:21]
随意在中间断开是没有问题的 。

**Eric** [20:23]
啊 ， 没错 。

**吴涛** [20:23]
它可以自 ， 对 ， 它可以就是自己揪 、 揪 ， 就是那个叫什么来着 ？ 就是给一个任意文本 ， 它可以在任意一个字节中间断开 ， 去找到下一个那个 code 是从哪里开始的 。

**Eric** [20:34]
嗯 。

**吴涛** [20:34]
但是 。

**Eric** [20:35]
嗯哼 ， 断得出来 。

**吴涛** [20:36]
那个什么 UTF-32、UTF-16、UCS-2 都做不到嘛 ， 你必须知道开头在哪里嘛 。 而且还有这个 byte order 的问题 ， 对吧 ？

**Eric** [20:44]
对 。 有大头小头的问题 。

**吴涛** [20:46]
对 。

**Eric** [20:47]
啊 ，不过 32 也有大 、 呃 ，32 也 ， 对 ，32 肯定有大头小的问题 。 对 。

**吴涛** [20:50]
所以这里就两个事情 ， 就是一个是说在 ， 呃 ， 传输中， 就存储过程中， 肯定是用 UTF-8 比较合理 ，不管是从它的这个编码的效率的和这个它的这个不 、 不分大小端 ， 然后也可以自纠错的这么一个属性来说 ， 肯定是存储和传输的时候是 UTF-8 比较合适 。

但是在就是计算机内部它运算和处理的时候 ， 它最好是一个定长 ， 或者是绝大部分是定长的时候更加有效率嘛 。

**Eric** [21:18]
嗯 。

**吴涛** [21:20]
所以就为什么导致现在的结果就是大家那些 ，不 ， 你看那些软件系统在内部的 internal representation 的时候 ， 要不就是选择 UTF-16， 要不就是选择 UTF-32 来做这个事情 。

**Eric** [21:32]
对 。 方便对齐嘛 ， 最主要 。

**吴涛** [21:34]
嗯 。 就方便对齐 ， 可以 random seek 嘛 ， 对吧 ？

**Eric** [21:37]
对 。

**吴涛** [21:37]
嗯 。

**Eric** [21:37]
比较 、 比较简单一些 。

**吴涛** [21:38]
嗯 。

**Eric** [21:40]
因为 UTF， 如果用 UTF-8 的话 ， 就是只要码位 ， 即使是基本文平面 ， 只是只要码位在 800 以上的 ， 都要用三个字节来表示 。

所以就是还是很浪费的 ， 就相和那个 UTF-16 比的话 。

**吴涛** [21:57]
而且它在那个变长的时候 ， 你 、 你没有办法在文本中说我跳到 1,000 个字符以外， 你中间就可能跳得很歪了嘛 。

**Eric** [22:05]
嗯嗯嗯 。 嗯 ，是的 。

**吴涛** [22:07]
32 就不存在这个问题 。

**Eric** [22:09]
嗯 。

**吴涛** [22:09]
对 。

**Eric** [22:10]
哎呀 ， 那些如果是欧美国家的 ，他们一听到完都在 ASCII 单字节的人 ，他们 。

**吴涛** [22:17]
所以 、 所以他们就不想 、 不想用 32 嘛 ，他们就想 。

**Eric** [22:20]
对啊 。

**吴涛** [22:20]
那个简单一点的 。

**Eric** [22:21]
对对对 。

**吴涛** [22:22]
嗯 。

**Eric** [22:23]
但是他们又想用 Emoji 啊 。

**吴涛** [22:26]
所以现在有人跟我们一样的痛苦啦 。 所以对吧 ？ 还不如用 32， 简单 。

**Eric** [22:33]
还是很浪费的呀 。

**吴涛** [22:35]
嗯 。

**Eric** [22:35]
所以啊 ，以前就很多 、 很多那种那些原来 Windows API 嘛 ， 对吧 ？ 原来是只 、 当然只能正确处理双字节的 ， 像那个 C++ 那时候就 ， 对吧 ？Wide chart T 它的那个定义就是 16 个比特的嘛 。

所以 。

**吴涛** [22:52]
嗯哼 。

**Eric** [22:53]
它会把那个 ， 它是不是如果用那 ， 它支持 UTF-16 吧 ？ 还是说 。

**吴涛** [23:01]
呃 ， 要看具体什么实现 ， 这个就比较复杂了 。

**Eric** [23:04]
哦 。 我 、 我看一个说法就是说它能 、 能显示这个四字节的字符 ，但是呢 ，由于那个 API 不能处理 ， 会把它给它当成两个那个双字节的字符去 。

**吴涛** [23:15]
对啊 ， 就所以 、 所以要看它的所在的那个环 、 那个运行环境和 API 怎么支持的嘛 。 就这个东西就是个纯 、 就是纯粹是个坑啊 。

**Eric** [23:22]
啊 ， 对啊 。 因为 。

**吴涛** [23:24]
谁干谁头疼 。

**Eric** [23:27]
具体会有什么毛病呢 ？ 就是乱码 。

**吴涛** [23:30]
那比如你算那个总数字数的时候就不对嘛 。

**Eric** [23:33]
啊 ， 那肯定 。

**吴涛** [23:34]
对 。

**Eric** [23:34]
嗯 。

**吴涛** [23:35]
那就本来一个字就在就算成两个字了嘛 。

**Eric** [23:38]
然后显示也可能会有问题 。

**吴涛** [23:40]
嗯 。

**Eric** [23:41]
就传输的时候就会有问题嘛 。 然后 。

**吴涛** [23:45]
传输现在我觉得还好 ， 传输现在基本上至少我看见的就是现 、 现代系统都是用 UTF-8 来编码了 。

**Eric** [23:52]
对 。

**吴涛** [23:52]
嗯嗯嗯 。

**Eric** [23:53]
对 。 就问题还是处在就是内部的 internal representation 的时候会有这个问题嘛 。

**吴涛** [23:58]
哎 ， 它传输的时候用 UTF-8 的话 ， 它 、 它到内部它得把 8 转成 16， 它要得转一次啊 ，是吧 ？

**Eric** [24:04]
对 ，有个编解码的一个过程 。

**吴涛** [24:06]
啊 。

**Eric** [24:07]
嗯 。

**吴涛** [24:07]
对 。

**Eric** [24:07]
而且这个 、 这个是非常 ， 这是几乎日常一定要做的一个工作 ， 所以目前的库也比较成熟嘛 。

**吴涛** [24:13]
嗯嗯 。

**Eric** [24:14]
就你不要自己去弄就好了 ， 就一定要用现有的解决方案 。

**吴涛** [24:18]
啊 ， 千万不要自己造轮子 。

**Eric** [24:21]
对 。

**吴涛** [24:21]
嗯 。

**Eric** [24:23]
那好吧 。 那所以呢 ， 就是 ， 嗯 ， 现在就 ， 哎 ，Java 现在的坑都解决了是吗 ？

### 彩色字体

**吴涛** [24:30]
呃 ，Java 从 Java 5 之后就改用 UTF-16 了吧 。 然后 。

**Eric** [24:35]
对 。

**吴涛** [24:36]
反正还是有一些问题的 ， 据说 ，但不太清 、 不太清楚具体是什么 。

**Eric** [24:39]
不是那么严重吧 ？ 基本上可以 。

**吴涛** [24:42]
就是 、 就是因为开始用 UTF-16 了 ， 所以就开始有坑了嘛 。

**Eric** [24:47]
嗯哼 。

**吴涛** [24:48]
这个代理 。

**Eric** [24:49]
要处理那个变长的问题 。

**吴涛** [24:50]
啊 ， 对 ， 要 、 要处理代理 、 嗯 ， 代理队的问题嘛 。

**Eric** [24:53]
嗯 。

**吴涛** [24:54]
UTF-16 说这个过不被 。

**Eric** [24:59]
不是我的问题 ，是你们实现的问题 。

**吴涛** [25:01]
嗯 ， 对 。 不管怎么样 ， 就是用 Emoji 这样的 ， 用以前这些罕用字嘛 ， 就是这些都有个 800、800 年用不到的这个码位用出来了以后， 还是督促了好多这些旧的环境要加强对这个 UTF-16 的支持 ， 这毕竟是个好事 。

**Eric** [25:20]
嗯哼 。 对 。 嗯哼 ， 这倒是 。

**吴涛** [25:21]
嗯 。

**Eric** [25:25]
好 。 呃 ， 然后下面一个问题就是我们上次没怎么讲那个 Emoji 的字体问题 ，其实上 。

**吴涛** [25:33]
嗯 ， 对 ，Emoji 的字体问题听起来有点奇怪 ，不过的确 。

**Eric** [25:37]
对啊 。 首先 ，Emoji 的字体默认是彩色字体 ， 这本身其实在字体技术上就是一个很重要的一步 。 因为大家都知道 ， 大家默认的字体黑 、 白底黑字啊 ， 就 、 就不带颜色的 ， 本来 。

**吴涛** [25:52]
对 。

**Eric** [25:53]
嗯 。 那现在大家最常用的 ， 比如说如果你安卓手机用的就是这个 Noto color Emoji， 那如果是苹果的设备的话 ， 用的都是叫什么 Apple color Emoji， 大家 、 大家一看就能知道 ， 这名字里面就有个 color 嘛 ， 就是颜色嘛 ， 就是彩色的彩色字体 。

所以呢 ， 就是现在呢 ， 我们的字体技术呢 ， 都已经支持这个彩色字体了 。 可是大家仔细在如果哈稍微的翻一下就会知道 ， 就我们其实无论是苹果的这个还是安卓的它这个 Noto， 它其实里面内嵌的都是未图 ， 就是都是 PNG 的图片 。

**吴涛** [26:33]
对 。 嗯哼 。

**Eric** [26:34]
嗯 。 它其实就是把一个个图片嵌到那个字体文件里头去了 。 所以如果大家 。

**吴涛** [26:40]
Noto 也是这么做的嘛 。

**Eric** [26:41]
啊 ， 对 ，Noto 也是 。 对 。 所以呢 ， 如果 。

**吴涛** [26:44]
我记得是谁 、 谁家是用 、 谁家是用偏 、 呃 ，SVG 的来着 。

**Eric** [26:48]
对 。

**吴涛** [26:49]
那好像是用 SVG 的 。

**Eric** [26:50]
嗯 。 好像是那个什么 Windows 是吧 ， 还 。

**吴涛** [26:55]
就 SVG 是那个嘛 ， 这个我们之前讲过呀 ， 就是在那个我们讲 Emoji 的那一期 ， 第三期吧 。

**Eric** [27:02]
那个 Adobe 和 Firefox 吧 ， 好像说的是 。

**吴涛** [27:05]
对 ， 就是 Adobe 和 Firefox 他们 、 他们定了那个 OpenType 的 SVG 的 ，其实就是应该是 Adobe 主导的吧 。 然后 Firefox 最先实现了这个 。

**Eric** [27:15]
嗯 。 对啊 。

**吴涛** [27:17]
嗯 。

**Eric** [27:17]
对 。 然后现在 Adobe 的 Photoshop 和 Illustrator 都能支持这个 OpenType 的 SVG 字体 ， 然后他们自己也做了几个实验性的字体 ， 陆续在发布 。

**吴涛** [27:27]
对 。 所以这个的话 ， 就是大家如果装了那个 Adobe 最新版的 CC 的话 ， 它就默认给你装那个 、 装的那个彩色字体 ， 它那个彩色字体的 Emoji 呢 ， 就是矢量的 。

**Eric** [27:41]
嗯哼 。

**吴涛** [27:41]
啊 ， 对 。 它其实就是一个 SVG 的一个矢量图 。

**Eric** [27:44]
SVG、SVG 的矢量图 。

**吴涛** [27:46]
嗯 。

**Eric** [27:46]
对 。

**吴涛** [27:46]
所以呢 。

**Eric** [27:47]
但是 Google、Google 是用 PNG 的吗 ？PNG 我一直以为是 Apple 的私有技术 。

**吴涛** [27:52]
Noto 也是 。 呃 ，Google 用的就是 Noto 嘛 ，Noto 的那个 Emoji 就是 。 都是 PNG 的 。 对 。 所以大家就知道 。

**Eric** [28:00]
哦 。

**吴涛** [28:00]
因为大家都 、 都现在的那个字体文件都是那个 OpenType 格式嘛 ，其实 OpenType 格式里面它既支持就是 Bitmap 这个未图的彩色字体 ，也支持就是矢量图的 SV， 要不然你可以嵌那个 SVG， 或者呢 ， 现在 OpenType 它有个叫 CPAL 的东西 。

啊 ， 那个叫什么 ？ 叫什么 Color Palette Table。 嗯 ， 就颜色 。

**Eric** [28:25]
对 ， 一个叫 Color Palette， 一个是 Color Palette。 对 ， 这个是微软做的那种啊 ，Emoji 的实现方式之一吧 。 它的作用原理就是说 ， 嗯 ， 它必须要分 、 分色来管理这个图层 ， 就它是图层的概念 。

**吴涛** [28:40]
嗯 。

**Eric** [28:41]
比如说我一个 Emoji 如果有三种颜色构成的话 ， 我得把这三种颜色分开做成三层 ， 然后这三层分别存储 ， 然后再用一个表来存它们的颜色 ， 最后就把它们叠加起来 。

**吴涛** [28:52]
嗯 。 为什么要做这么复杂呢 ？

**Eric** [28:55]
对 ， 这其实是个折中吧 。 我觉得可能在这个图形处理上的效率会高一些 。 因为如果你要做一个 SVG 这样子的矢量的 Emoji 的话 ， 你都得支持渐变色 。

**吴涛** [29:06]
嗯 。

**Eric** [29:07]
然后 Windows 那个就是它不需要支持渐变色 。 另外它有个好处就是 ， 它应该某种程度上很容易跟原来那种单色的字体直接兼容 。

**吴涛** [29:17]
嗯 。

**Eric** [29:18]
对 ，因为它每一个 、 呃 ， 每一个层本质上还是一个单色的这个矢量轮廓 ， 就跟传统的字体一样 。

**吴涛** [29:25]
只是绘制三遍而已 ， 可能比如说 。

**Eric** [29:27]
对对对 。 如果你有三种颜色 ， 你只要三遍 ， 然后叠加起来就可以了 。

**吴涛** [29:31]
那我就感觉还不如直接用 PNG 算了 。

**Eric** [29:34]
对 ，PNG。

**吴涛** [29:35]
何必呢 ？

**Eric** [29:36]
因为 PNG 是之前是 Apple 基于那个 TrueType 直接扩展的一个私有实现 ，但我不知道它现在有没有开放这个专利给别人。

**吴涛** [29:43]
现在 、 现在已经变成那个普通的 、 呃 ，OpenType 的格式了 。

**Eric** [29:47]
啊 。

**吴涛** [29:48]
它说不定写进 OpenType 标准了 。

**Eric** [29:50]
对 ， 写进去了 。 对 。

**吴涛** [29:52]
啊 。 它 、 它之前实现了一个表叫 SBIX 嘛 ， 我们当时还讨论过这个表是代表了什么意思 ， 就它那个缩写一直没有一个 ， 就没有一个官方的说明 ， 这个 SBIX 这四个字母代表的是哪个缩写 。

**Eric** [30:08]
X 应该是 extend 吧 。

**吴涛** [30:12]
啊哈 。

**Eric** [30:15]
BI 是什么 ？Bit 什么什么东西了 ，Bitmap。

**吴涛** [30:18]
Bitindex、Bitindex 之类的 。

**Eric** [30:21]
哎 ， 你是说 ， 呃 ， 苹果的那个哈 ？

**吴涛** [30:23]
对 ， 苹果之前用的一个叫 SBIX 的一个表来实现了这个 Emoji 的 、Emoji 的这个 PNG 的实现方式 。其实它不只支持 、 不只支持 PNG 吧 ， 它支持很多未图 ， 像什么 JPEG、 什么 TIFF， 还有 Apple 最喜欢用的 PDF 它也是支持的 。

**Eric** [30:43]
嗯哼 。

**吴涛** [30:44]
嗯 。

**Eric** [30:45]
因为那个它有一个彩 、 呃 ， 彩色字体的话 ， 它有个 CBDT 的表 ， 叫 Color Bitmap Data Table。

**吴涛** [30:57]
啊 ， 这个 、 这个是之前那个 Google， 就这个是 OpenType 最早的那个自己定的一个公共标准 。 对 ， 就是有两个表 ， 一个 CBDT， 一个 CBLC 是吧 ？

**Eric** [31:09]
对 。

**吴涛** [31:10]
嗯 。

**Eric** [31:11]
对 ， 然后两个表合起来 。

**吴涛** [31:13]
嗯 。

**Eric** [31:15]
啊 ， 对 ，CBLC 那个也是支持未图的是吧 ？CBLC 合起来 。

**吴涛** [31:20]
对 ，因为 CB 的 B 就是 Bitmap 吧 。

**Eric** [31:24]
啊哈 ， 所以这种也是一种未图的那个技术 。

**吴涛** [31:27]
对 。

**Eric** [31:28]
对 ， 就是都是未图的 ， 这俩都是未图的 。

**吴涛** [31:30]
对对对 。

**Eric** [31:31]
那就跟那个 Apple 的还不一样 ，Apple 那个还是私有的 。

**吴涛** [31:36]
嗯 。 但是不管怎么样 ， 嗯 ， 你可以塞这个表吧 ， 对吧 ？

**Eric** [31:41]
对对对 。

**吴涛** [31:42]
对 。

**Eric** [31:44]
矢量图的话 ， 刚才说就是用那个 CPAL 嘛 ， 就是 Color Palette 嘛 。 我现在在看那个文档 ， 它那个颜色是用那个叫就是 BGR， 呃 ，BGR 就是那个红 、 红绿蓝嘛 ， 就是三原色嘛 。

**吴涛** [32:01]
RGB， 对 ，RGB。

**Eric** [32:04]
RGB 也有吧 ？

**吴涛** [32:05]
啊 ， 随便吧 。 然后那个 A 就是那个 Alpha 吧 ？

**Eric** [32:08]
哈哈哈 。

**吴涛** [32:09]
好吧 ，RGB。

**Eric** [32:10]
我 、 我还是第一次意识到你 、 你那个你在心 、 你在 、 在你的这个思想里面 ， 你一直是在你脑海里面 ， 你是把 RGB 你继承 BGR 了吗 ？

**吴涛** [32:20]
没有 。

**Eric** [32:21]
因为我一直都是 。

**吴涛** [32:22]
他是念 RGB，但是对 ， 我现在照着这个文档念的 ， 它是 BGR。 它写的 ， 它说的是 BGRA，是吧 ？

**Eric** [32:30]
它按字母序 。

**吴涛** [32:31]
哈哈哈 。

**Eric** [32:33]
我 、 我吓我一跳 。

**吴涛** [32:35]
我那我 、 我也觉得念起来怪怪的 ，但是它那文档里面就是这样写的 ，BGRA 值 。 所以它还有个 。

**Eric** [32:41]
它就这样排这个色号的 。

**吴涛** [32:43]
对对对 。 啊 ，有还有个 Alpha 通道嘛 ， 我 、 我想说的是 ， 就除了那个三原色那个 RGB 的话 ， 还有个 Alpha 通道就透明的嘛 。

嗯 。

**Eric** [32:54]
嗯 。 所以呢 ， 就是现在呢 ， 总的来讲就是你虽然 、 虽然在说的是字体的问题 ， 可是 ， 呃 ， 你现在为了用 Emoji，其实 、 其实我们在讲图像和图形的问题了 。

就比如说我们要讲它到底是个未图还是一个矢量图的问题嘛 。

**吴涛** [33:11]
对 。

**Eric** [33:11]
对 。 所以这个东西都搅在一起了 ， 变成以前来讲的哦 ， 文字是文字 ， 图形是图形 。 所以但是这个 Emoji 呢 ， 就是因为它就是一个 ， 它其实是一个展现形式是一个图 ， 所以呢 ， 现在呢 ，在一个 OpenType 特性的一个字体文件里 ， 我们还要再考虑它是矢量图还是未图 。

**吴涛** [33:29]
这印证了什么 ？ 这印证了中国那句古话 ， 书画不分家 。

**Eric** [33:33]
哈哈哈哈 。

**吴涛** [33:42]
我觉得这个是 Unicode 的一个 、 一个贪念吧 ， 就是就他们太贪了 ，他们想把什么东西都文字 。

**Eric** [33:50]
对 。 所以没有就当年就是 Emoji 要不要进 Unicode 这个事情本身的话 ， 就是吵得很厉害嘛 。 就是这一个潘多拉的盒子一打开来的话 ， 就 、 就无穷尽了嘛 。

就这个也是在我们上次 。

**吴涛** [34:04]
上次没了啦 ， 这个事情 。

**Eric** [34:05]
对 ， 就我们上次第一次进入 。

**吴涛** [34:07]
我觉得 Unicode 吧 ，Unicode 它毕竟是个 code 呀 。

**Eric** [34:11]
嗯 。

**吴涛** [34:12]
这个 Emoji 它不是个 code， 这是 、 这是一个非常 fundamental 的东西 ， 我觉得 。

**Eric** [34:18]
哈哈哈 。

**吴涛** [34:20]
它也可以说是一种 code。

**Eric** [34:22]
对啊 ， 就看你以什么 、 以什么对象来 code 呀 。

**吴涛** [34:25]
就我的意思是 code。

**Eric** [34:27]
它不叫 UNISCRIPT， 它叫 Unicode。

**吴涛** [34:29]
比如说 ， 对 ， 它 、 它不是一个书写系统啊 ，Emoji 不是一个书写系统啊 。 你就最 、 最典型的一个 。

**Eric** [34:36]
上行文字呀 。

**吴涛** [34:37]
对 ， 我觉得最典型的一个特征就是 Unicode 是没有读音的 。

**Eric** [34:40]
对 。

**吴涛** [34:41]
嗯 。

**Eric** [34:42]
对吧 ？

**吴涛** [34:42]
嗯 。

**Eric** [34:44]
但哎呀 ，但很多符号也没有读音 。

**吴涛** [34:47]
对啊 ， 你也讲不清楚啊 。

**Eric** [34:50]
但它就是一种 code。

**吴涛** [34:51]
我觉得啊 ， 对 ， 它 、 它能 、 它能归到 code 里 ，因为它不是 ， 就它不叫 UNISCRIPT， 它叫 Unicode。

**Eric** [34:58]
好吧 。

**吴涛** [34:59]
它就能把所有东西都写成 code。

**Eric** [35:02]
好吧 ， 这个已经它已经成既成事实了 ，而且大家这么喜欢 ， 我们现在没有办法再翻回去翻案讲这个事情 。

**吴涛** [35:11]
嗯 。

**Eric** [35:14]
啊 。 啊 ， 然后呢 ， 现在我们再来讲另外一个问题 ， 就是很烦的一点 ， 就是有一些东西它既可能是以文本形状出现 ， 又可能是以这个 Emoji 形状出现的 ， 比如说 ， 呃 ， 沙漏啊 ， 或者像那个箭头 ， 上下左右的箭头嘛 。

### 文本与Emoji形态

**Eric** [35:33]
啊 ， 就是原来 Unicode 它已 、 已经 、 已经有一部分就是文本样子的东西 ，但是呢 ， 我们现在又有这个 Emoji 的版本 ， 表情符号版本 ， 所以有时候会混在一起 。

那就要 。

**吴涛** [35:48]
对 。

**Eric** [35:48]
就要搞一个优先顺序和指定 ， 说啊 ， 这时候我希望它是以 Emoji 的样子出现 ， 或者这时候我希望它是以文本的样式实现 。

然后这个实现方式居然有很多很 、 很神奇的用法 。 我去翻了一下那个 ， 呃 ， 这个文档哈 ， 才发现说如果你要去指定 ，其实是有三种做法 。

然后呢 ，其中有 、 有两种做法是特别神奇 ，是要去指定这个语言 。

现其实说那个说到语言的话 ， 就是 language， 大家可能如果熟悉这 HTML， 大家都知道吧 ， 大家要进行网页的语言声明嘛 ， 哈 ， 说这个语言是什么 、 什么样的 。

然后 。

**吴涛** [36:29]
嗯哼 。

**Eric** [36:30]
然后现在才发现 ， 呃 ，ISO 就是这个 Unicode 和这个 ， 呃 ， 国际组织居然造了一个语言 ， 就一个语言代码就是是 A 给 Emoji 的 ， 这个 。

**吴涛** [36:43]
哦 ， 专门给 Emoji 的 。

**Eric** [36:45]
对 ， 没错 。

**吴涛** [36:46]
啊 。

**Eric** [36:47]
Zsye 和 Zsym。

**吴涛** [36:52]
这两个分别代表什么呢 ？

**Eric** [36:54]
Zsye 呢 ， 就是 、 就是 Emoji， 那个 e 就代表 Emoji， 就是所以 、 所以它展示出来就是那个 Emoji 符号的 。 那 Zsym 呢 ， 就是 、 就是用文本形式 。

所以 。

**吴涛** [37:07]
Zsye 什么意思啊 ？

**Eric** [37:09]
它没什么意思啊 。

**吴涛** [37:11]
哈哈 ，不可能 。

**Eric** [37:13]
啊 ？

**吴涛** [37:13]
我也查不出来什么意思 。

**Eric** [37:15]
没有什么 ，因为什么呢 ？ 首先它那个 z 后面都是一些就是 、 就是零散用的东西 。

**吴涛** [37:22]
对 ， 那个 sye 指的是 symbol 嘛 。 那个 z 是不是为了把它排到这个表的最 、 最末尾 。

**Eric** [37:30]
嗯 。

**吴涛** [37:30]
对 ， 垃圾桶那一堆 ， 对吧 ？

**Eric** [37:31]
对对对 ，z 就是最 、 最后面嘛 。 那所以呢 ， 原来那个 symbol，symbol 的拼写不就是 symbol。

**吴涛** [37:39]
对对对 。

**Eric** [37:40]
嗯 ， 所以那个 zsym 呢 ， 就是就所以这 、 这个很早以前就是加入到这个规范里面来的 。 啊 ，但是呢 ， 它因为是 symbol， 它就虽然说是符号 ， 它就还是以文本形式 ， 就黑白形式出现的 ， 就是像 、 像字一样的 。

嗯 。 然后它的那个 zsye 呢 ， 就是 Emoji 啊 ， 就像图形形状 。 所以呢 ， 就是说你如果把像按这个表演与 、 与跟它并列的是什么 ， 比如说是汉语啊 ， 啊 ， 比如 、 比如说日语啊 ， 日语不是 j、jp 吗之类的 ， 你 j、aj、jp 嘛 ， 你把它指定成这个语言的话 ， 啊 ， 它是 、 它是日语 。

然后如果把它指定成那个 zsye， 就是 e 的话 ， 它就会表现出 Emoji。

**吴涛** [38:25]
对 。

**Eric** [38:25]
你看我们的 Emoji 已经堂而皇之的成为一个语言了 。

**吴涛** [38:30]
对 ， 所以将来要是有人拿这个傻不拉几的拿这个语言列表来写一个 dropdown list， 你会发现里面你可以变 ， 你可以声明自己是一个 native Emoji speaker。

**Eric** [38:41]
对啊 。

**吴涛** [38:42]
哈哈哈哈 。

**Eric** [38:45]
请问怎么和人交流 ？

**吴涛** [38:47]
不是说一大堆 Emoji 是吧 ？

**Eric** [38:51]
怎么说嘛 ， 没法说呀 。

**吴涛** [38:53]
对 。

**Eric** [38:55]
不就像盲文一样吗 ？ 盲文不是也没法说出来吗 ？

**吴涛** [38:59]
这只能在这比划 。

**Eric** [39:00]
不 、 不叫什么盲 ，不是盲文 ， 叫手语 。

**吴涛** [39:03]
不是 ， 手语是比划的 ， 对 。 嗯 。

**Eric** [39:06]
还有那个 、 那个布莱耶那个 。

**吴涛** [39:07]
啊 ， 布莱耶点 ， 嗯 ， 盲文点字嘛 。

**Eric** [39:10]
点 、 点 、 点 。

**吴涛** [39:11]
嗯嗯 。

**Eric** [39:11]
对 。

**吴涛** [39:13]
肯定大家一开始就可以想象吧 ， 你比如说你 、 你这样变成这个 ， 如果你写到那个语言声明里面去 ， 肯定不好用啊 。

你这比如说你整个网页的网页声明 ， 那个语言都变这个 Emoji 语言 。

**Eric** [39:25]
它可以局部声明 ， 它可以局部声明 。

**吴涛** [39:26]
对啊 ， 对对 ，不好用嘛 。 所以呢 ， 后来才发现 ， 呃 ，其实呢 ， 还有另外一个机制 ， 那就是说 ， 呃 ， 叫 ， 呃 ， 呃 ，Unicode 它有个叫 Emoji 的 Locale 的 extension。

大家知道 Locale 叫这我们中文 ，Locale 中文叫什么 ？ 本地设置 。

**Eric** [39:45]
本地化啊 。

**吴涛** [39:46]
啊 ， 本地设置的扩展 。 啊 ， 然后这个扩展呢 ，是 、 是 -em 啊 ， 来进行扩展 。 所以呢 ， 你可以用一个 ， 比如说在一个语言里面 ， 比如说是美国英语哈 ， 英语不是 en 嘛 ， 然后 hyphen 美国啊 ，US， 然后再 hyphen 写个 em 就扩展 ， 然后再 hyphentext， 然后就说明啊 ， 我这时候用的是文本文 、 文 、 文本状态的 。

**Eric** [40:17]
啊 。

**吴涛** [40:17]
那那意思是所有的这个 Emoji 的符号都有一个对应的文本形态的这个 。

**Eric** [40:22]
不一定 。

**吴涛** [40:22]
这个形态 。

**Eric** [40:23]
不一定 ， 这是有定义的 。

**吴涛** [40:24]
不一定 ，有些有 。

**Eric** [40:25]
嗯 ，有的有 ，有的没有 。

**吴涛** [40:27]
对 ，有些有 。

**Eric** [40:27]
嗯 。

**吴涛** [40:28]
那它们这个转化规则是怎么样子 ？

**Eric** [40:30]
有 、 有定义的 。

**吴涛** [40:31]
就是都有定义 。

**Eric** [40:32]
不是 ， 我的意思就是 ， 比如你看你列 、 列的这个 en、us、um、emoji， 然后如果我要切换成下面那个 text 的话 ， 那哪些会被转化成那种黑白的这种情况 ？

**吴涛** [40:44]
啊 ， 都是有定义的啊 ， 你去看那个码表里面它都写着的 。

**Eric** [40:49]
对 ，其实就是 ， 嗯 ， 简单来说 ， 那些 ， 嗯 ，Emoji 的码位跟那个只有纯 text 形式的这个符号的码位 ，其实并不是完全一样的 。

**吴涛** [41:00]
嗯 。

**Eric** [41:01]
嗯 ， 它们 ， 呃 ， 实际上它们后面要多加一个 Unicode 的一个符号来区分它 。 但 、 但其实它我觉得是个历史遗留吧 ， 比如说像箭头这样的东西 ， 它肯定在 Emoji 产生之前 ， 它已经有了 。

**吴涛** [41:15]
就已经有了 。

**Eric** [41:15]
Unicode 已经给它编码了 。 对对对 。

**吴涛** [41:17]
对 。

**Eric** [41:17]
所以那个时候它本来就是 text 形式的 。 那么后来新加了一些 Emoji 进来 ， 然后发现我也可以做一个 Emoji 的箭头 ， 然后所以我不知道它是不是为了节省码位 ， 所以就重用了那个码位 ， 再加一个 ， 再加一个标志符来区分它是 Emoji 还是不是 Emoji 的 。

**吴涛** [41:35]
那 、 那 、 那这里还有一个问题 ， 就是说如果有这个有一些这个对应关系 ， 它是一个一一映射呢 ， 还是说其实是一个不能 ， 就是一个就是不能 、 不可逆的一个操作 ？

就是我从那个 Emoji， 就是 、 就是 -emoji 这个这种语言的 extension 切换成这个 text 之后， 还能再切回来吗 ？

**Eric** [41:55]
嗯 ， 只要你的这个软件可以处理 ， 然后你有相应的字体就可以 。

**吴涛** [42:01]
对 ，不是我这个问题嘛 ， 比如说就好像那个中文的这个繁简的这个这个转化 ， 它是不可逆的嘛 。

**Eric** [42:07]
啊 。

**吴涛** [42:08]
啊 。

**Eric** [42:09]
对 ， 它 、 它这个 ， 它这个其实是从这个角度上来说 ， 它应该是可逆的 。

**吴涛** [42:13]
它是可逆的 。

**Eric** [42:14]
就它不会丢失信息相当于 。

**吴涛** [42:16]
对对对对对 。

**Eric** [42:17]
OK。

**吴涛** [42:17]
因为就是 。

**Eric** [42:18]
就它的语义信息并没有丢失掉 。

**吴涛** [42:20]
因为这些东西在那个 Unicode 它那个码位上里面原来都有定义的 。 如果大家去翻 ， 就是你比如说那个箭头啊 ， 那个箭头的它 、 它都会写 ， 比如说左箭头 、 右箭头 ， 它都会有一个 ， 呃 ， 比如说 Emoji style 是什么样的 ，text style 是什么样的 。

它 。

**Eric** [42:37]
嗯 。

**吴涛** [42:38]
本来在 Unicode 码位的时候它就有定义了 。 那然后你再 、 再这边再进行这个选择的时候 ， 它就依照那个定义去显示 ， 就完了 。

**Eric** [42:48]
OK。

**吴涛** [42:49]
嗯 。

**Eric** [42:49]
那也就是说是一个 ， 就怎么说 ， 我可以这么理解吗 ？ 就是 Emoji 的那个码位对应成那种文本的形式的时候 ， 它是一个一对一的 ，但是有些是 ， 呃 ，不叫一对一 ， 这 、 这叫什么来着 ？

那个数学里面有一个性质 ， 就是 。

**吴涛** [43:03]
满射 ， 全 、 全 、 全映射 ， 你想说这个是吗 ？

**Eric** [43:07]
但是也不是啊 ，因为它有些是没有对应的 。

**吴涛** [43:10]
我知道 ， 我知道你的这个意思 。

**Eric** [43:12]
哈哈 。

**吴涛** [43:12]
啊 。

**Eric** [43:13]
嗯 ， 就是我想怎么解释清楚这个概念哈 。 就是有一些这种 Emoji 的图案 ， 图案是没有 。

**吴涛** [43:19]
没有的 。

**Eric** [43:20]
这个对应的文 、 文本形态的 。 但是如果它有的话 ， 它一定是一个一一对应的关系 。

**吴涛** [43:25]
是 。 对 。

**Eric** [43:26]
啊 。

**吴涛** [43:26]
嗯 。

**Eric** [43:28]
啊 ， 明白了 。OK。

**吴涛** [43:30]
就现有的情况来看是这样的 。

**Eric** [43:32]
是的 。

**吴涛** [43:32]
嗯 。

**Eric** [43:33]
嗯 。 像比如说你有一个什么西兰花的一个 Emoji 的形式嘛 ，但是你就没有西兰花的这个这个文本形式嘛 。 就是原来的那个 。

**吴涛** [43:42]
西兰花 。

**Eric** [43:43]
对啊 ，不是有西兰花嘛 。

**吴涛** [43:45]
那 、 那我再问一个问题哈 ， 就是那个什么 ， 现在 Emoji 上一版不是出了各种各种肤色人种嘛 ， 对吧 ？

**Eric** [43:52]
啊 ， 对 。

**吴涛** [43:54]
它 、 它要做成这个文本形式怎么办 ？

**Eric** [43:57]
首先那个啊 ， 这个我们后面会讲嘛 ， 就是肤 、 肤色的话 ， 它其实是有一个肤色定义符嘛 。

**吴涛** [44:04]
哦 ， 这但是就是它转化成文本之后就没有颜色这个这个表达形式了嘛 ， 对吧 ？

**Eric** [44:09]
嗯 ， 所以它会退化成呃 ， 这显示出来的 ， 它就变成两个两个符号 ， 就是原来呃 ， 一个人， 然后一个那个带 、 带那个肤色符 ， 它其实就是阴影嘛 ， 就是不同浓度的阴影 ， 它会显示成两个 。

**吴涛** [44:25]
啊 。

**Eric** [44:26]
嗯 。 这 、 这 、 这当然也要看环境了啊 ， 要看环境看 。

**吴涛** [44:31]
对 ， 实际上实际上新造的 Emoji 它们通常不会再特意造一个文本形式 。

**Eric** [44:37]
对 。

**吴涛** [44:37]
嗯 。

**Eric** [44:38]
就那种有文本形式的 ， 多半都是因为它本来是个文本符号 ， 然后后来 Emoji 也把它做了一个 Emoji 的版本 。

**吴涛** [44:45]
嗯嗯 。 所以这时候就是 。

**Eric** [44:48]
你刚发了一个页面 ， 这个是我们经常会遇到的一个 。

**吴涛** [44:52]
嗯 。

**Eric** [44:52]
符号 ， 就是它原来是有这样一个纯文本形态的符号 ，但是 Emoji 进到 Unicode 之后，Emoji 的部分里面也有这样一个符号 ， 然后那个符号是一个图像形式的 。

**吴涛** [45:03]
嗯 ， 就重了嘛 。 嗯 ， 像比如说圆圈啊 、 方块啊 ， 还有比如说这个上下左右箭头啊 ， 就是这是重灾区嘛 ， 就是都 、 都会有这种问题 。

**Eric** [45:12]
明白了 。

**吴涛** [45:13]
嗯 。 然后这再接着讲 ， 就是然后大家发现说 ， 如果我要切换这个普通字符和 Emoji 都要靠语言来讲的话 ， 的确是太坑了 。

于是大家就想出了第三种办法 ， 就是应该乖乖的用 VS。VS 是叫什么 ？ 叫 Variation Sequence， 叫什么 ， 呃 。

**Eric** [45:35]
变体序列 。

**吴涛** [45:35]
变体序列 ， 没错 。 对 。 呃 ， 所以呢 ， 这不能切换语言 ， 那它就另外再加个变体序列 。 它自会说序列 ， 就是说我在这个原来这个码位后面再 、 再加一个码位 ， 让它变成一个序列啊 ， 然后补充说明说我这时候要的是 ， 呃 ， 普通字符的形状 ， 或者说我就我规定要用这个 Emoji 的形状 。

呃 ， 为此呢 ， 这个 Unicode 专门指定的哈 ， 呃 ，在 Unicode 有好多好多的变体序列符啊 ， 符号 ， 然后 V 有好多的 VS， 然后它就指定第 15 号的 VS 用来指定代表 ，是来指定用文本形式显示 ， 第 16 号的这个 VS 呢 ，是用表情符号显示 。

所以呢 ， 你只要像比如说一个在一个左箭头里面 ， 后面后面再补一个 ， 加一个 15 号的这个这个变体序列的话 ， 那最后就是强制说啊 ， 我这前面这个码位一定要用文本形式来显示 。

那其实就是说我后面补充说明又加了一个码位嘛 。 所有这些加码位会变成什么样子呢 ？ 在这个 Unicode 的这个码位表里面也都是有定义的 。

**Eric** [46:51]
OK。

**吴涛** [46:51]
嗯 。

**Eric** [46:51]
嗯 。

**吴涛** [46:53]
这个其实我们 TIB 的网站上也出了好多这个问题 ， 对吧 ， 振宇 ？

**Eric** [46:58]
啊哈 ， 这个就是我刚刚给你们发的一个那个网页链接里 ， 这是我们在这个我们经常写博客可能会用到的这样一个字符 。

比如说你用一些 Markdown 的编辑器 ， 如果你写一个脚注 ， 它帮你自动生成那个脚注的那个跳转回去的那个符号 ， 它会加上这个符号 ， 然后这个符号恰好就是一个 。

**吴涛** [47:20]
回车嘛 ， 就像那个回车的那个 。

**Eric** [47:23]
它是一个返回符号 ， 就是一个返回箭头类似的这样一个 。 然后这个符号恰好就是就是我们遇到的那种 ， 它本身有一个 text 形式的 ，但是它也有一个 Emoji 形式的这样一个符号 。

然后这种符号 ， 呃 ， 如果我们用了这个正确的 VS 来指定它强制显示哪一种形式的话 ， 那么现代的操作系统和浏览器都会显示的对 。

但如果你没有加这个 VS，也就是我只放了这个 。

**吴涛** [47:51]
码位 。

**Eric** [47:52]
码位的 ， 对对对 ， 就没有后面加更多的东西 ， 那么在不同的环境中有的时候会显示的不一致 。

**吴涛** [47:59]
谁知道它会变成什么样子 ， 就是如果你不指定的话 。

**Eric** [48:03]
对 ，其实这应该算是一个应该算是一个实现的错误吧 ， 我觉得 。 就是我们现在发现不一致的 ， 最明显的就是 iOS 的这个 Safari 或者说它的 WebView 上面会出现这个优先显示 Emoji 形态的这种情况 。

那么按照 Unicode 标准的这个定义来说 ， 它应该是优先显示纯文本形式的 。

**吴涛** [48:23]
嗯 。

**Eric** [48:25]
嗯 ，但这个可能是当时我不知道是不是 。

**吴涛** [48:27]
应该是苹果 。

**Eric** [48:28]
苹果为了秀它的这个 Emoji 字体 。

**吴涛** [48:31]
对 ，有可能 。

**Eric** [48:31]
所以将尽可能能显示成 Emoji 符号的字符都显示成 Emoji。

**吴涛** [48:35]
都显示成 Emoji。

**Eric** [48:35]
对 ， 就是在 iOS 嘛 ，在移动端的话就尽量都 、 都显示成这个 Emoji 了嘛 。

**吴涛** [48:41]
对 ，但 Mac 上的这个 Safari 就没有这个问题 。

**Eric** [48:45]
嗯 。

**吴涛** [48:46]
所以我与其这样不 、 不可控 ， 我还不如说硬加上这个指定符 ， 让它强制指定变成我所要的样子 。

**Eric** [48:57]
对 。

**吴涛** [48:58]
嗯 ， 所以要加的这个东西就叫 VS， 就叫变体序列 。 呃 ，而且呢 ， 注意这个变体序列它也是一个特殊的控制符啊 ， 对于可能熟悉呃什么中汉字什么一体字的朋友们 ， 就经常会想到那个什么 ， 我们叫什么一体字的变表意字的一体字序列啊 ， 那个就叫 IVS 啊 ， 就我们就是这个 Idiographic， 就表意字的一呃变体序列 ， 就经常比如说呃 ， 比如说回字有四种

写法什么的啊 ， 那现在呢 ， 就有这种 IVS 在一个汉字后面补上哈 ， 嗯 ， 各种各样的给它编号啊 ，1 号 、1 号回字 、2 号回字 、3 号回字 、4 号回字 ， 强制指定让它显示成这个某个一体字的样子啊 。

这个东西的话其实在现在 ，因为在日本的需求是非常大的 ， 你现在呢 ， 就新的这个操作平台和环境里面都可以实现了 。

呃 ， 反正在中国国内的话 ，因为对一体字的要求不是很多 ， 所以呢 ， 呃 ， 倒不是呃支持的很广泛 。

嗯 。

**Eric** [50:08]
哎 ， 我插一个问题 ， 就是你日人民最喜欢用的 Emoji 是哪一个 ？

**吴涛** [50:14]
啊 ？

**Eric** [50:14]
之前不是 。

**吴涛** [50:15]
这个问题好难啊 。

**Eric** [50:17]
之前不是评选过吗 ？ 就是全球有什么 。

**吴涛** [50:20]
苹果是那个笑哭的那个吧 ？

**Eric** [50:22]
那笑哭的 。

**吴涛** [50:23]
不是全球 。

**Eric** [50:24]
全球的是吧 ？ 啊 。

**吴涛** [50:25]
啊 ， 全球的 。

**Eric** [50:26]
全球最喜欢用的 。

**吴涛** [50:27]
嗯 ， 我也是高频用那个 。

**Eric** [50:29]
嗯 。

**吴涛** [50:31]
日本的有吗 ？ 我不知道哎 。

**Eric** [50:34]
它好像有专 ， 它好像有专门评论 ， 就是选那个全球每个国家的 ， 就是啊 ， 哪个国家是最喜欢用那个拜用手拜拜的那个姿势 。

**吴涛** [50:44]
啊 ， 那不是泰国吗 ？

**Eric** [50:46]
中国吗 ？

**吴涛** [50:47]
好像不是泰国 。

**Eric** [50:48]
拜拜啊 。

**吴涛** [50:49]
就是泰国人不是每说一句话都要合掌 。

**Eric** [50:52]
感谢会出来那个 。

**吴涛** [50:53]
啊 。

**Eric** [50:55]
所有泰国人说话都必须要合掌 ， 我不觉得 ， 那可能肯定是泰国或者东南亚人民最喜欢用的 。

**吴涛** [51:01]
对 ， 就泰国看新闻 ，他们那个主持人结束之后都要拜拜一下 。

**Eric** [51:06]
那他们普通人说话就是必须的 ， 比如说 sawatigra 就必须得 。

**吴涛** [51:11]
平时有时候两个泰国人在街上你不说也是还 、 还蛮正常的吧 。

**Eric** [51:16]
呃 ， 理论上讲就必须得要的 ， 就是你说 sawatigra 但是不合掌的话 ， 这个就就等于就不在意 。

**吴涛** [51:25]
不礼貌是吧 ？

**Eric** [51:26]
就是没有在打招呼 ，其实就是感觉 。

**吴涛** [51:29]
OK。

**Eric** [51:29]
呃 ， 对于泰国人来讲哈 ， 就是我为什么说这个 。 所以你查到那个 。

**吴涛** [51:36]
我忽然想到那个最最最受欢迎的 Emoji， 日本最受欢迎 ，因为你刚才说到那个日本人对 Emoji 的需求很高嘛 。

**Eric** [51:44]
嗯 。

**吴涛** [51:45]
啊 ， 我刚才说我刚才说的是日本人对那个一体字的需求很高 。

**Eric** [51:49]
啊 ， 一体字 ，sorry。

**吴涛** [51:51]
哈哈哈哈 。

**Eric** [51:54]
日本现在都 、 都流行用那个各种贴纸了是吧 ？ 已经不用 Emoji 了 。

**吴涛** [51:58]
如果那样你看到 ， 如果你用 line 的话 ， 那大家都是还是用贴纸的嘛 ， 对吧 ？ 就是就像用微信的同学都 、 都用贴图嘛 。

**Eric** [52:10]
对对对 。

**吴涛** [52:11]
我表情包 。

**Eric** [52:12]
我一度是从来不贴图的 。

**吴涛** [52:15]
哎 ， 好烦呐 。 好吧 ， 我们还是说回 Emoji。 那我们下一个话题呢 ， 就是合成 Emoji 的问题 。 就是说不是并不是一个 Emoji 就对应一个码位 ，而而且呢 ， 这个 Emoji 的合成还有各种各样的问题 。

我们上次并没有就说清楚哈 ， 所以这次再跟大家总的来讲一下 ，因为上次说的零零碎碎的哈 。

### 合成Emoji

**Eric** [52:38]
对 。

**吴涛** [52:38]
嗯 ， 首先呢 ， 就是 Emoji 里面有单体啊 ， 然后就是还有这合成 ， 就是所谓的 Emoji Sequence， 就是有序列 。 那序列里面呢 ， 基本的常用的序列 ， 呃 ， 常用的话是有三个 ， 一个呢是叫做 Combining Sequence， 叫组合序列 。

那就就比如说那个键位 ， 比如说那个键帽 ， 呃 ， 就比如说这个键盘 ， 一 、 一号键盘啊 ， 比如说像那个电话 ， 呃 ， 电话的键盘 ， 如数字 123456789， 还有井号 。

如果后面加上那个呃 2013，2013 号数字 12013， 这这这个这个键 ， 它叫叫 keycap， 就是那个键帽 ， 这个码位它会自动组合成一个 ， 就比如一号键的这样的一个 Emoji。

所以呢 ， 你看上去是一个一号键的一个 Emoji，但可是它实际上呢 ， 它是一个数字 1 的一个码位和键帽这两个码位组合而成的 。

啊 ， 这个是这个所谓的组合 Sequence。 第二个呢 ， 就是大家呃经常常见的这个 Modify Sequence， 就是比如说那个肤色啊 。

**Eric** [53:52]
嗯哼 。

**吴涛** [53:52]
呃 ， 会在就凡是和这个人脸有关系的这个图后面呢 ， 可以加上肤色的话 ，是现在有几几层啊 ？123456， 一六个层度 ， 六个程度是吧 ？

好像 。

**Eric** [54:08]
六个黑度 。

**吴涛** [54:09]
哈哈 ， 好吧 ， 六个黑度 。Fitzpatrick

定义的六个层度啊 ，是由白到黑 。 嗯 ， 所以呢 ， 比如甚至呢 ， 就是这个人不仅是人的脸啊 ， 包括人的各种器官 ， 包括手啊 、 腿啊 、 脚啊 ， 啊 ， 比如说鼓掌的那那那个也可以的 。

那哪些可以加 ， 哪些可以不加 ， 这在这个 Unicode 也是有有定义的 。 就说这个范围内的的东西是可以配合这个肤色 ， 呃 ， 肤色定义符的 。

嗯 ， 所以呢 ， 你可以 ， 所以圣诞老人好像老人也是可以的嘛 ，因此呢 ， 圣诞老人也有各种各样的肤色的版本 。

**Eric** [54:51]
嗯 ， 黑人圣诞老人可以 。

**吴涛** [54:54]
嗯 ，但是梅花鹿就没有啊 ， 对不对 ？ 那个鹿的话是是不能配合这个人的肤色的版本啊 。 所以呢 ，有的是可以加 ，有的不能加 ， 能不能加是事先有定义的 。

然后呢 ， 然后

。

**Eric** [55:11]
拜拜 。

**吴涛** [55:11]
呃 ， 第三个主要为什么你们笑得那么奇怪 ？ 呃 ， 第三个 。

**Eric** [55:17]
笑点是什么 ？ 你解释一下 。

**吴涛** [55:19]
我也不知道 ， 我只是想笑 。

**Eric** [55:22]
没有 ， 我因为我刚才举例的不好 ， 我应该说呃 ， 这个比如说鱼也是不能加上肤色的 ， 比如说黑鱼就变成烤鱼是吧 ？

**吴涛** [55:32]
对啊 ，其实如果我们仔细想一想 ， 这个问题还蛮可笑的 ， 就是凭什么 Unicode 规定了哪个东西能加肤色 ， 哪个东西不能加肤色 。

就实际上如果我有一个私有的 。

**Eric** [55:45]
Unicode 最终掌握掌握所有的种族问题的生杀大权 。

**吴涛** [55:49]
对啊 ，而且肤色没有任何的 。

**Eric** [55:52]
肤色也就是话语权 。

**吴涛** [55:54]
对 ， 就这个肤色 ，而且没有任何的意义 ， 肤色也不能区分种族什么的 ， 对吧 ？

**Eric** [55:59]
对 。

**吴涛** [55:59]
就是你不能严格的用肤色来区分种族 。

**Eric** [56:02]
嗯 。

**吴涛** [56:02]
所以就没有任何的意义 。

**Eric** [56:03]
嗯 ， 哎 ， 反正这个这个事情很扯的啊 。 呃 ， 然后接着讲第三种 ， 就是 Emoji 的 Flag Sequence，Flag 就是旗帜啊 。 这次这个好像我们上次没说过 ， 比如说我们看起来啊 ， 比如说中国的国旗是一个 Emoji，但是它的背后其实是至少是三个码位啊 。

首先是一个旗 ， 一个空旗的 ， 就代表一个旗帜的一个码位 ， 然后加上比如说中国是 CN， 对吧 ？ 就这个区 ， 它有个专专门 。

**吴涛** [56:37]
ISO 的那个国家代码嘛 。

**Eric** [56:39]
对对对 ， 它有专门的一个叫 Regional Indicator， 这叫什么区域指示符的这样一个东西 。其实这区域指示符就是 26 个字母啊 ， 然后就就专用的 ， 就是这个专门用在旗帜上的这种组合的 。

那比如说这个旗旗帜 ， 然后旗帜专用的 C， 旗帜专用的 N， 那就是 CN 的旗 ，也就是中国的旗 。 然后呢 ， 这三个嗯码位结拼在一起的话 ， 显示出来是中国的国旗 ，但是它背后是三个码位 。

**吴涛** [57:16]
那你说第三个是什么来着 ？ 第三个是什么 ？

**Eric** [57:19]
嗯 ？

**吴涛** [57:20]
就是开始是一个空旗嘛 ， 然后是国家代码嘛 。 第三个是什么 ？

**Eric** [57:23]
啊 ， 国家代表是两两个数 ， 两个拉丁字母 ， 比如说 CN。

**吴涛** [57:28]
啊 ， 就三个三个 。 哦 ， 明白 。

**Eric** [57:31]
嗯 。

**吴涛** [57:31]
那也不够用啊 。

**Eric** [57:34]
啊 ， 所以这个也是有定义的啊 ，也的确是不够用 ，但是还是有定义的啊 。

**吴涛** [57:39]
好吧 。 然后这还会涉及到后面的东西啊 。 嗯 ， 然后就是主要的主要的常用的这个 Emoji 呢 ， 就是这三种了 。

然后还有次要的就是各种扩展型的 。 扩展型呢 ， 就比如说就最近的 iOS， 它现在呃经常加的 ， 比如说各种家族和家各种家庭 ， 还有职业的这种 Emoji， 这种 Emoji 是自由组合的 。

所以呢 ，并不是呃 ， 所以是有的字体有 ，有的字体没有啊 。 那比如说现在最新加的呃各种各样的家庭嘛 ，不是现在呃 。

**Eric** [58:16]
奇怪的家庭组合 。

**吴涛** [58:18]
正正确 。

**Eric** [58:18]
嗯 ， 正两个男人组 ， 两个男人和一个男孩组成的家庭 。 所以大家去翻一个家庭 ，不有各种各样组合吗 ？

呃呃 ， 一男一个男人和一个女人组 ， 然后带两个男孩 ， 就这样子嘛 。 因为各有各种各样的家庭嘛 ， 所以呢 ， 给它拼合起来 。

那这个拼合用的是一个 ZWJ， 就是我们说说的那个 ， 这叫什么零宽组合 ， 零宽结合器是吧 ？

**吴涛** [58:47]
嗯 ，Zero Width Joiner。

**Eric** [58:50]
Joiner。

**吴涛** [58:50]
嗯 ，Joiner。

**Eric** [58:51]
嗯 ， 所以呢 ， 像比如说哈 ， 我刚才说的 ， 比如说两个男人和一个孩子 ， 三口之家 ， 我们看起来是三口之家这样一个 Emoji，但是实际上它的背后呢 ，是呃一个两个呃一个男人， 然后加上这个加号 ， 就必须要用那个呃 Zero Width Joiner 啊 ， 加上一个男人， 再加上一个小孩 。

所以你看起来表面上是一个 Emoji， 可是背后呢 ，是五个码位 。

**吴涛** [59:26]
OK。

**Eric** [59:27]
嗯 ， 这是比如说这是家庭啊 ， 还比如说职业 ， 比如说呃职业的话 ， 一个女性的山地车运动员啊 ， 为了怎么 。

**吴涛** [59:41]
女生的车 。

**Eric** [59:41]
OK。

**吴涛** [59:41]
然后呢 。

**Eric** [59:42]
现在像某种语言的单词练习 。

**吴涛** [59:44]
哈哈哈 ，不是啊 ，他终他们终于发明了中国的部首啊 ， 偏旁部首啊 。

**Eric** [59:49]
啊 ， 这样的 。 所以你你你看起来这是一个女性的女性的那个山地车运动员的这样一个图 ， 可是它背后呢 ，是首先呢 ， 它是一个山地车手的一个图 ， 然后呢 ，有一个女性符号 ， 然后啊 ，而且呢 ， 还有一个因为她是女性人嘛 ， 所以呢 ， 她还有肤色 ， 还可以加上肤色啊 ， 中间呢 ， 还要再用这个 Zero Width Joiner 给它给粘连起来啊 。

然后呢 ， 你还要如果你再印嗯 ， 这样的话 ， 至少呢 ， 后面是有四个四个到五个的码位才能实现这样的一个图 。

**吴涛** [1:00:29]
OK。

**Eric** [1:00:30]
嗯 。 呃 ， 这是是目前上已经已经定义下来的定义下来的这样一个序列 。 另外呢 ， 还有一个叫 Emoji 的 Tag 序列 ， 就是加标签 。

这个标签嗯 ， 加标签这个事情呢 ，Unicode 草案其实已经有提交了 ，但是嗯 ， 前段时间被撤回啊 。 所以目前来讲呢 ， 还不是它只是一个提案 ， 还没有实现啊 。

呃 ， 大家我把这个链接发给大家 ，是在就是 UTS 的第 52 号提案啊 ， 大家可以去看 。 然后这里面很扯 ， 呃 ， 它就是加个标签 ， 那意思是比如说我可以显示人的头发 ， 从呃白头发到黄头发到红头发到黑头发 ，以至秃头 。

**吴涛** [1:01:18]
哈哈哈 。

**Eric** [1:01:21]
因为他给就每每每种头发都都加了一个标签 。 首先呢 ， 它有个有个有个 base，有个 base， 就是说啊 ， 我这是头发标签 ， 然后呢 ，在头现在个标签上面写贴上程度啊 ， 比如说是是黄头发或者是秃头啊 ， 然后对 ， 就是这样的 。

接下来在一个序 ， 呃 ， 所以呢 ， 你可能要在一个比如说是男孩的头发上面标签 ， 加上一个黄颜色来体现一个就是金黄色头发的男孩的一个 Emoji。

嗯 ，也是可以实现的 。 然后呢 ， 刚才还有说呃 ， 可以用于改变这个目前的这个 Emoji 的方向 ， 呃 ， 一些 Emoji 它画出来是有方向的 。

呃 ， 最最有名的就比如说那个手枪 ， 目前的手枪好像是 。

**吴涛** [1:02:17]
只能朝右 。

**Eric** [1:02:18]
只能朝右是吗 ？ 还只能朝左好像 。

**吴涛** [1:02:22]
啊 ， 就是被改成那个在 Mac 上 ，在 iOS 上被改成自水枪 。

**Eric** [1:02:28]
自水枪啊 ，是水枪 。 嗯嗯 ， 好像只有嗯 ， 只能朝左 。 这样的话 ，有时候你在表示谁射杀谁的时候 ， 谁打谁的时候 ， 就是就就会有方向性的错误嘛 。

**吴涛** [1:02:40]
对 。

**Eric** [1:02:40]
因此呢 ， 嗯 ，因此呢 ，在这个这个提案里面 ， 它嗯 ， 它先加一个方向标签 ， 然后在这个方向标签就写上里面的具体的值 ， 比如说我是向左指还是向右 。

嗯 。

**吴涛** [1:02:53]
天 。

**Eric** [1:02:54]
这就不能向右上方 772 度的方式打 。

**吴涛** [1:02:58]
哈哈哈 。

**Eric** [1:02:59]
对啊 ， 这个方向的值应该怎么设呢 ？ 对吧 ？ 还有刚才说的就是像刚才 Rio 比较担心的就是国旗不够用嘛 。

嗯 ，其实现在已经这个是已经可以实现 ， 就是比如说英英格兰旗 ， 大家知道英格兰它不是一个国家嘛 ， 它是一个地区嘛 。

那英格兰的国 ， 英格兰这个旗是什么实现的呢 ？

**吴涛** [1:03:21]
小心英格兰人来找你拼命啊 。

**Eric** [1:03:23]
它只是一个地区嘛 。 所以但如果像比如说旗的话 ， 国旗的话 ， 像英国的国旗 ， 我们刚才说了 ， 它你看看是是一个英国国旗 ， 可是它背面的首先是首先是这个旗帜的一个码位 ， 然后加上旗帜的 U， 旗帜的 K， 就是 UK 的旗啊 ， 就是英国的国旗 。

那它嗯 ， 这个新的加上 tag 以后， 它可以啊 ， 好啊 ， 对不起 ，不是 UK，是 GB，Great Britain 啊 。 所以呢 ， 那英格兰呢 ，是这个旗加上 GBENG， 就是 Great Britain England， 就是所以一共是这六个码位一串 ， 加起来呢 ， 就是这个英格兰的旗 。

**吴涛** [1:04:07]
OK。

**Eric** [1:04:08]
所以这是一个草案 。 嗯 ， 大家还嗯 ， 还在讨论 ，但是有目前呢 ， 已经有些实作是可以出来了 。 嗯 ， 我真的不敢想象 ， 就比如说刚才那个男士变成秃头的那样的一个 Emoji， 会会被画成什么样子 。

我想那以后是不是应该还对胡子也应该进行定义一下 。

**吴涛** [1:04:30]
哈哈哈 。

这进一步的凸显了这这帮人想把那个 Unicode 用来做任何事情 ， 就用来表示任何可见的东西 。

**Eric** [1:04:43]
异端 。

**吴涛** [1:04:44]
嗯 。

**Eric** [1:04:44]
哈哈哈 。

**吴涛** [1:04:45]
你在想什么 ？Unicode 的 uni 什么意思嘛 ？ 你都 。

**Eric** [1:04:48]
Universal 的 。

**吴涛** [1:04:49]
嗯 ， 对 。

**Eric** [1:04:49]
野心太大了 。

**吴涛** [1:04:50]
嗯 。

**Eric** [1:04:51]
不过作为一个作为一个技术来讲的话 ， 就是说我这个技术只要规范定出来以后， 它可以实现的功能是强大的 。

它可以它的意思就是说我这个技术很好啊 ， 说明 。

**吴涛** [1:05:03]
为了炫耀这个技术也不至于搞成这样吧 ， 我觉得 。

**Eric** [1:05:06]
嗯 ， 所以你们知道巴别塔多难造了吗 ？

**吴涛** [1:05:09]
是这样的 。

**Eric** [1:05:09]
嗯 ，但是刚才说的就是这个没有通过的这个草案哈 ， 这个在通过加标签的这个这个想法 ，其实这个思路倒是很就是很普通嘛 ， 就是你先做一个 tag， 然后再定义这个 tag 的值 ， 对吧 ？

这是很正常的一个思路嘛 。

**吴涛** [1:05:30]
嗯 ，其实有点鸡贼 ， 就是他还是想省码位嘛 。他他没有那个霸气到说你来一个 ， 我给你个新码位 ， 就你还得用一些东西给它组合起来 ， 这样可以 。

哈哈哈 。 我觉得 Unicode 迟早有一天说好吧 ， 我把这码位继续的扩增 ， 扩增到你想用多少就用多少 。

**Eric** [1:05:53]
他还是想用那个偏旁部首的吧 。

**吴涛** [1:05:56]
嗯 。

**Eric** [1:05:56]
对吧 ？ 老祖宗的办法 。

**吴涛** [1:05:58]
嗯 。

**Eric** [1:05:59]
就中国人早在几万几几千有文字的时候 ，有文字是什么时候 ？2,000 年 ？

**吴涛** [1:06:05]
5,000 年 。 谁知道呢 。

**Eric** [1:06:07]
没有没有没有 ， 中国人 5,000 年就就发明文字是什么 ？ 就是尤安可察的第一个甲骨文 ，在这个时候就已经想到这个问题了 。

**吴涛** [1:06:16]
公元前应该也有了吧 。

**Eric** [1:06:18]
那当然有啊 。

**吴涛** [1:06:19]
公元太晚了 ， 够到你就不用想公元了 。 公元太晚了 ， 公元前多少年吧 。 嗯 ， 就已经想不到这个问题了 。

**Eric** [1:06:29]
你看那个什么 ， 要是爱斯基摩人也来搞这个 Unicode，他起码把这个血片要搞成 50，50 种不同类型的血 。

**吴涛** [1:06:37]
嗯 ，是个 miss 吧 。 这是个 miss 好像 ， 就是并这种这件事情并不存在 。

**Eric** [1:06:43]
但是 。

**吴涛** [1:06:44]
爱斯基摩人其实没有那么多语言来描述血 。

**Eric** [1:06:47]
但是阿拉伯语里面有很多种骆驼 ， 对吧 ？ 古汉语里面有很多 。

**吴涛** [1:06:53]
就是中国很多 。

**Eric** [1:06:54]
古汉语里面很多马 ， 对吧 ？ 还有很多驴 ， 对吧 ？ 汉字 。

**吴涛** [1:06:58]
而且而且其实这这东西爱斯基摩人语言里有没有并不重要 。 像日本人发明了 Emoji，他们也没想要那么多的图片 ，但是现在还是可以搞出那么多 。

所以全球人民的智慧是可以让这个东西无限多下去的 。

**Eric** [1:07:14]
啊 ，不管怎么样 ， 反正现在的技术已经达到这个水平了 ， 所以大家往往看上去是一个简单的 Emoji， 可是它的背后谁知道呢 ？

它可能是一个码位 ，也可能是五六七八个码位组合而成的 。

**吴涛** [1:07:28]
嗯嗯 。

**Eric** [1:07:30]
嗯 ， 所以下面就涉及到下一个问题了 ， 就是所谓的字位错的问题了 ， 对吧 ？ 这个这这个翻译叫字位错吗 ？

### 字位簇

**Eric** [1:07:41]
可能大家都听不懂 。

**吴涛** [1:07:42]
Cluster cluster cluster， 这中文一边中文一般一般被翻译成醋 。

**Eric** [1:07:47]
醋从就是一团东西啊 。 然后 grapheme grapheme 一般来讲我们翻译成字位啊 ， 就是像因为呃在英呃语音学里面啊 ， 区别意思的这个音才是有叫一个音位嘛 。

**吴涛** [1:08:02]
有意义的 。 对 。

**Eric** [1:08:03]
对 ， 那就在文字里面就是区有区别 ， 这个就是在书写语言里面的一个最小单位 ， 我们就叫它字位 。

那么这个字位错 ， 哈哈哈 ， 听起来好奇怪啊 。Grapheme cluster。

**吴涛** [1:08:21]
抱歉 ， 我邪恶了 。

**Eric** [1:08:24]
啊 ， 就是你要看起来就是人看起来是一个字 ， 机器可因为刚才也说了嘛 ， 我们一个看人看起来是一个 Emoji，但是呢 ， 机器它后面认的可能是一个码位或者是五六个码位啊 。

比如说在数数的时候 ， 这到底是几个字啊 ， 这这个东西的话都都说不清楚 。 因此呢 ，其实在 Unicode 里面 ， 它 Unicode 有个标准附件的第 29 号啊 ， 它这个名字叫 Unicode Text Segmentation， 这叫文本分隔法啊 ， 就专门来规定就你怎么样看起来这算是一个字啊 ， 怎么怎么在怎么怎么来定义这个词的界限和字的界限 。

**吴涛** [1:09:07]
这这是考虑什么 ？ 就是为了分词吗 ？ 还是为了什么 ？

**Eric** [1:09:10]
其实啊 ， 应该是给这个 Unicode 的实现给了一个文档吧 ， 就是你怎样来实现这个东西 。

**吴涛** [1:09:16]
给了一个 reference。

**Eric** [1:09:17]
对 ，其实啊 ， 这个最早最早是为了给那些泰文和那个比如说印度的那些文文字来做的 。 因为嗯 ， 还比如说藏文大家也知道嘛 ， 泰文的话 ， 它可能是在中间一个字 ， 中间一个基本字母以后， 它可能会在这个字的上下左右添加各种东西 。

**吴涛** [1:09:38]
对 。

**Eric** [1:09:39]
嗯 ， 所以呢 ， 对于泰文来讲 ， 即使它添加了上下左右的东西 ，但是它对于泰文来讲 ， 这还依然是一个字 。

那码位的话 ， 那那它它是好多码位 。 而且呢 ， 你已经把它认成一个字以后， 比如说你在删除的时候 ， 你要必须把它认成一个字吗 ？

你在选选中的时候 ， 你必须要给它整个选中啊 ， 或者你让不让它选中部分去修改或怎么样 ， 或者你删除的时候 ， 你必须要整个删除 ， 还怎么怎么样啊 。

这这在一些 。

**吴涛** [1:10:11]
不能删除一个字的部首 ， 对吧 ？

**Eric** [1:10:13]
对 ， 你删了就突然删了半个字 ， 这个是什么鬼啊 ？ 就是有时候对 。

**吴涛** [1:10:19]
好吉吉 。

**Eric** [1:10:20]
啊哈哈哈

。

**吴涛** [1:10:24]
所以 。

**Eric** [1:10:25]
这点很奇怪吗 ？ 我 。

**吴涛** [1:10:29]
所以这个东西其实都是还要要有定义的 ， 要呃 ， 首先在码位这边 ， 呃 ，在 Unicode 呃层面要有定义 ， 然后再让这个呃这叫什么 user engine 的去依照这个定义来进行实作嘛 ， 要不然的话就大家会乱七八糟的嘛 。

**Eric** [1:10:45]
对 。

**吴涛** [1:10:45]
嗯 。

**Eric** [1:10:46]
然后另外一个比较呃典型的 ， 就比如说韩文 ， 可能大家会比较清楚 。 韩文其实它是一个就是生母孕母这样拼起来的嘛 。

**吴涛** [1:10:58]
嗯 。

**Eric** [1:10:58]
因此呢 ，其实在韩文音节里面 ， 它嗯喝完韩哈 ， 比如说那个韩字哈 ， 一个 him， 一个 a， 一个 nyun， 它可以是三个字拼在一起 ， 一旦拼起来的话 ， 韩这个就就那这就是一个字了呀 。

你不能就是想选择的话 ， 当当就会涉及到什么呢 ？

**吴涛** [1:11:19]
我是觉得韩文其实挺神奇的 ， 就是它明明是它其实是字母 ， 然后它组合的方式就是地上的汉字组合方式 。

**Eric** [1:11:28]
对 ， 所以 Unicode 为了解决韩文问题发生了很大的波折 ， 就是一开始就说你韩文就不要占这个一个码位了 ， 你就组合的就不要占组合的码位 ， 你就一个一个拼吧 。

然后又又出现了 。

**吴涛** [1:11:45]
就来一个编 。

**Eric** [1:11:46]
就来一个拼一个来个拼一个 。 嗯 ， 这样会有一个很大的问题是什么呢 ？ 就是在检索的时候会有问题 ， 就比如你搜索的时候 ， 对吧 ？

你嗯 ， 你韩文那你肯定要以整整个字去搜啊 ， 你不能以一个一个声母去搜啊 ， 那个声母搜出来就是全篇到处都都都选中了 ， 就变成 。

**吴涛** [1:12:07]
对 。

**Eric** [1:12:08]
嗯 。

**吴涛** [1:12:08]
但我们也有部首减字法呀 。

**Eric** [1:12:11]
啊 ， 对呀 ，但是比如说我在一篇文章里面 ， 我我要搜呃 。

**吴涛** [1:12:15]
问题是韩文没有部首啊 。

**Eric** [1:12:18]
它是一个拼音 ， 它是一个拼音问题 。

**吴涛** [1:12:21]
它那个它是把拼音用部首的方式组合在一起 ， 我觉得这个挺神奇的 。

**Eric** [1:12:25]
嗯 ， 对对对 。 这样会给它这个检索和嗯检索会造成很大的问题啊 。 因为退一万步来讲 ， 我们这个所谓的叫信息化处理 ， 是一个信息交换的一个过程吧 。

你在交换来交换去 ，不能会有这个错误和这个遗漏啊 。 这这这这完全没有达到目的嘛 ， 搞来搞去 ， 它消变信息就变变了 ， 这这或者有有遗失了 ， 然后传递有问题了 ， 这个是很大的问题嘛 。

嗯 ， 所以呢 ， 它就必须要有规定 ， 就是你人看起来这个一团东西是认成是一个字 ， 那么你机器要怎么处理 。

**吴涛** [1:13:09]
对 。

**Eric** [1:13:10]
嗯 ， 然后呢 ， 具体到我们的这个 Emoji 里面的话 ， 就是像刚才说了哈 ，因为 Emoji 它可能我们看起来是一个 Emoji，但是它后面可能是三个码位或者四个码位 。

那比如说在数数的时候 ， 当那个当数字的时候啊 ， 这个到底是几个字的时候就会有问题吧 。

**吴涛** [1:13:32]
嗯哼 。

**Eric** [1:13:34]
呃 ， 好像我我今天看一个资料就我对 Ruby 不熟哈 ，Ruby 里面它那个 string， 它那个在在数这个量子的时候 ， 它就是用码位来数字数 ， 这这显然就不对啊 ， 就一个码位 。

**吴涛** [1:13:50]
大部分的语言里面都是这么干的 。

**Eric** [1:13:52]
对 ， 一个码位就不是一个数啊 。

**吴涛** [1:13:56]
对啊 ， 它只会数这个呀 。

**Eric** [1:13:58]
对 ， 更高更高级的信息它没有 ， 就是或者是更高信息更麻烦 。

**吴涛** [1:14:03]
那它 。

**Eric** [1:14:04]
你必须要专门的库来实现 。

**吴涛** [1:14:05]
嗯 。

**Eric** [1:14:06]
所以现在不是哎 ， 像 Twitter 它现在数数它不是也变了 ，不是它前段时间把那个 140140 变成 280 了吗 ？ 好像英语可以写 280 个字了 ， 可是中日韩还是还是 140 个字吧 。

**吴涛** [1:14:25]
地狱骑士 。

**Eric** [1:14:27]
哈哈 ， 我我这很好奇 ，他他他还特地给为为中为这个中日韩写开了一个这例外， 这个这个这太扯了 。

**吴涛** [1:14:36]
也不是专门为应该应该是还我还是那个西方中心主义 ， 就是把他们认为应该扩展的部分扩展了 ，其他的部分就通通试做两个 。

**Eric** [1:14:47]
就是要以大家能能表达的这个总的信息量来数吧 。

**吴涛** [1:14:52]
那你信息量来数的话 ， 本来 140 字的那个中文就是可以一一篇小段落了 ， 一大段落了 ， 就是 。

**Eric** [1:15:01]
嗯嗯 ， 所以我觉得像什么微博啊 ， 就学什么 140 个字 ，140 个字学过来用用汉字写的话 ， 这这本来就就跟那个英文的 140 根本不是一个层面上的东西 ，在信息量上来讲的话 。

**吴涛** [1:15:17]
对 。

**Eric** [1:15:18]
嗯 ， 对 ， 这这是一个 。

**吴涛** [1:15:19]
谁让我们字符极大呢 ？

**Eric** [1:15:21]
这是完全是一个历史遗留 ， 这完全是一个历史遗留 。

**吴涛** [1:15:25]
我们表意字符的话 ， 就是本来信息量就是很大嘛 。

**Eric** [1:15:29]
嗯 ， 对啊 ， 对 ， 你不可能通过字数来衡量信息量的 ， 就这个方式是非常不科学的 。 因为比如说 。

**吴涛** [1:15:37]
你算出来一个汉字到底能有多少商啊 ？

**Eric** [1:15:40]
嗯 ， 对对对 ， 比如说你这个汉语 ， 简单来说 ， 我们知道文言的汉语显然这个长度更短嘛 ， 就它用的这个字数更少 ， 那你这个白话文的汉语就用的字数更多 。

所以你单纯用字数来限制这个信息量 ，其实是一个非常没有道理的事情 。 就在即使是在同一种语言当中，Twitter 早期它限制这个字数纯粹是一个技术原因嘛 ， 或者说是一个呃模拟的短信 。

**吴涛** [1:16:05]
它不是技术原因吧 ？ 它它只是 。

**Eric** [1:16:06]
它是模拟了这个短信时代的 。

**吴涛** [1:16:08]
短信是短信 ，也不是技术原因 。 短信是就所有这 140 字这个公筹 ， 就是为什么我们现在很多东西都是 140 字 ， 或者为什么 Twitter 今天是 140 字 ， 全都源自于一个德国人。

**Eric** [1:16:21]
啊 。

**吴涛** [1:16:22]
就是当初当初设计短信标准的那个人 ，他在科隆还不是什么地方 ， 杜塞尔多夫附近有一个实验室 ，他在那边呃做了大概几个月的研究 ， 就是用给别人写片写便签啊 ， 或者是给别人发短的电子邮件之类的 ， 然后最终得出一个结论 ， 说 140 个字对于德语来说 ， 对于德语来说 ， 满可以满足 90% 以上的短消息的要求 ， 然后他就把 。

**Eric** [1:16:51]
吹牛逼 ， 吹牛逼 。

**吴涛** [1:16:53]
他就把短信标准定成了 160 个字符 ， 应该是 160 个字 。

**Eric** [1:16:57]
够吗 ， 德国人 ？

**吴涛** [1:16:59]
加上不够了 。

**Eric** [1:17:00]
因为单词那么长 。

**吴涛** [1:17:03]
真的 ， 这这不是这不是什么 ， 这不是什么 urban legend， 这是一个就是我记得在在哪个地方看到过报道 ， 我回头把那个链接发到那个 show notes 里面 。

就这一切都要怪一个德国人。

**Eric** [1:17:15]
哈哈哈 ， 大词 。 然后现在就搞的这个 Twitter， 它那个算呃算字数的那个方式很奇怪嘛 。 呃 ， 现在就就比如我们今天讲的 Emoji 嘛 ， 它虽然说英文是允许 280 个字字了 ，但是呢 ，Emoji 的话 ， 它还还是把一个 Emoji 当成两个字来算 。

所以呢 ， 比如说你一个笑脸的话 ， 只能打 140 个笑脸 ，不能打 280 个 。

**吴涛** [1:17:46]
嗯哼 。

**Eric** [1:17:47]
嗯 。

**吴涛** [1:17:49]
280 个笑脸 。

**Eric** [1:17:51]
哈哈哈哈 。

**吴涛** [1:17:52]
所以所以 Twitter 做这件事情的考虑点其实不是为了存储 ， 对吧 ？

**Eric** [1:17:57]
对 。 嗯 ， 我而且它它因为哎 ， 它就它就数数 ， 肯定还是首先是列了 ， 应该是列了个白名单吧 ， 就是从码位开始考虑吧 ， 要么它肯定是要首先是认这个字啊 。

**吴涛** [1:18:11]
嗯 。

**Eric** [1:18:11]
然后再根据这个字来数这个数 ， 它数数它肯定是用 Java 数的吧 ？

**吴涛** [1:18:19]
为什么是用 Java 数 ？

**Eric** [1:18:21]
它肯定是在前端先 JavaScript 上写 ， 后台 API 的时候再再审一遍 。

**吴涛** [1:18:26]
对啊 ， 要不然的话 ， 你你现在一边输的话 ， 它就会写吧 ， 你还够写几个字嘛 ， 就必须要有动态的算嘛 。

**Eric** [1:18:35]
嗯哼 。

**吴涛** [1:18:35]
嗯嗯 。

**Eric** [1:18:37]
所以就很扯呀 。

**吴涛** [1:18:38]
它有个那个 indicator。

**Eric** [1:18:39]
嗯嗯 。

**吴涛** [1:18:42]
所以现现在就我们才发现 ， 原来数字数也是一个非常难的事情 。

**Eric** [1:18:49]
我觉得取决于你想要花多少的决心在里面 ， 就比如说你可以按那个 Unicode 那个我们上次介绍过的那个 cluster， 就算 cluster 的方法来 ， 就是均一化 ， 先把它均一化 ， 然后算那个被均一化出来的之后的东西是多少个字 ， 那就是多少个字 。

**吴涛** [1:19:06]
均一化你怎么均一化呀 ？

**Eric** [1:19:09]
我们上次不是介绍了那个呃 Unicode 规范化的方法吗 ？

**吴涛** [1:19:13]
啊 ， 规范化啊 。 嗯 ， 然后呢 ， 我们再说到这次就是有一个那个呃 ，因为我刚才说了 ，有组合的字 ， 它经常会有引引引出一个 bug 啊 ， 像刚才说的 Emoji 有一个这个刚才说的键帽啊 ， 比如说那个电话号码的一一号键吧 ， 啊 ， 一号键的的这个问题呢 ， 就是和这个字位处的这个定义就有问题啊 。

比如说哈 ， 我在输入的时候 ， 我先输入数字一 ， 然后呢 ， 再输入那个键帽 ， 根据 Unicode 规定 ， 它会自动会缩合成这个一的这个 Emoji 嘛 。

嗯 ， 然后呢 ， 你再输入一个那个键帽 ， 就单纯那个键帽 ， 没有没有那个键键的话哈 。

**Eric** [1:20:05]
嗯 。

**吴涛** [1:20:05]
这三个码位摆在一起 ，其实这个是不符合这个 Unicode 标准的 ， 这是一个错的序列哈 。 但是不管怎么样 ， 呃 ， 用户看起来就是前面两个缩合成了一个 Emoji， 然后后面是一个是一个空的一个键嘛 ， 对吧 ？

用户看起来是两个东西 ， 然后这时候用户摁下删除键的时候 ， 理论上讲就是说后面那个空的键帽删除嘛 。

但是呢 ， 根据这个 Unicode 定义 ， 这个键帽是必须要和前面这个看成一一团东西的 ，是认成一个字的 。

所以呢 ， 只要你一删除 ， 连并前面的那个一号键也一起都被删掉了 。

**Eric** [1:20:48]
OK， 我好像遇到过这个问题 。

**吴涛** [1:20:50]
嗯 ， 就是嗯 ， 所以就会有有各种各样的问题 。 我在那个就咱们这个呃嗯 show notes 啊 ， 咱们的 online 里面 ， 我打了几个那个键帽吧 ， 你们可以试着删除一下 。

就是一一不 ， 你以为是会把最后一个字符删除 ， 结果是一团字 ， 一整个这个呃 cluster 全被删掉了 。

**Eric** [1:21:16]
哦 ，OK。

**吴涛** [1:21:19]
还有时候根根据不同的那个呃环境哈 ，有的有的可以复现 ，有的不能复现 ， 比如说了国旗 ， 呃 ， 所有的国旗至少是后面背后是三个码位嘛 。

如果你这个嗯 ， 如果那个码位都都是连连续的话 ， 可能在删除的时候删错的话 ， 就会出现那个显示显示错误 。

**Eric** [1:21:41]
可能也看你这个你这个文本编辑器的这个 。

**吴涛** [1:21:44]
对 。

**Eric** [1:21:44]
本身的处理能力吧 。

**吴涛** [1:21:46]
对 ， 如果你那个文本 。

**Eric** [1:21:48]
有的会原地删好多次才能删掉一个 。

**吴涛** [1:21:51]
对 ， 如果文本编辑器比较难用的话就做不到 。

**Eric** [1:21:55]
嗯

，但这个就是因为大家用的这个 API 用的那个库不一样吧 ， 你你很难统一的呀 ， 就就比较麻烦 。

**吴涛** [1:22:05]
对 。

**Eric** [1:22:06]
所以还是建议大家说不要自己造轮子 ，不要自己去搞这个东西 。 你以为好像你解决了你手头目前那个问题 ，但是你肯定没有想到可能会漏掉的其他的东西 。

**吴涛** [1:22:20]
对 ，而且说说回刚刚 Twitter 那个事情 ， 就是我们说 Twitter 它数这个字数 ，其实它数字数它有很多很复杂的其他逻辑在里面 ， 比如说它会把 URL 当成一个固定长度的字符串来计数 ， 无论这个 URL 有多长 ， 只要它是合法的 URL。

**Eric** [1:22:37]
嗯 ， 它就它就是一团东西 ， 对吧 ？

**吴涛** [1:22:40]
嗯 ， 对对对 ， 就是它不会根据这个 URL 实际的字符数量来计数 ， 它是记成一个固定的数字 。

**Eric** [1:22:46]
图片链接也是一样吗 ？

**吴涛** [1:22:49]
啊 ， 对对 ， 就是所有的这种媒体多媒体性的这种链接 ， 然后还有 URL， 它都会用一个固定长度的字符串来给你替代 ， 就作为它的这个字符串的长度 。

**Eric** [1:23:03]
嗯 。

**吴涛** [1:23:03]
所以你你也可以把你的文字信息伪装成一个 URL 往里面写 ， 特别像中文这种不需要分词的 ， 哈哈 ，URL 也是支持汉字的吧 ， 应该 。

**Eric** [1:23:13]
嗯 ，是的 ，URL 长度也有限制啊 ，URL 最长不超过 。

**吴涛** [1:23:17]
对对对 ，但你这样就可以远远超过这个现有的 140 汉字的限制了 。

**Eric** [1:23:23]
问题是你表达不出来啊 ，因为那个 URL 在很多那个 Twitter 客户端里面 ， 它不会完全展示的 。

**吴涛** [1:23:28]
啊 ，也是 。

**Eric** [1:23:29]
它会缩 。

**吴涛** [1:23:31]
对对对 ，而且有可能会被生成 。 对 。

**Eric** [1:23:33]
嗯 。

**吴涛** [1:23:34]
啊 。

**Eric** [1:23:36]
所以啊 ， 就是刚才也说嘛 ， 你就会可以想到会有各种各样的隐藏的方法 ， 或者各样这个嗯耍赖皮的方法 ， 这个呢就很可能会被利用 。

那而且呢 ，有时候就往往会被利用 ， 发生这个安全漏洞的问题 。 所以这个东西的话 ， 还是大家嗯千万不要自己乱搞 ， 干脆其实目前来讲的话 ， 最稳妥的一个办法还是交让那个 OS 处理 ， 就就用最标准 ， 用最新的 API。

**吴涛** [1:24:07]
啊 ，不过 Web 的好像还就得自己处理 。

**Eric** [1:24:10]
啊 ，Web 方面 ， 哎呀 ， 所以啊 ， 这个你还是要多多测试 。 嗯 ，不过今天又回到这个主题嘛 ， 就是因为现在大家在以前呢 ， 可能有一些问题呢 ，并都放的也是放的 ，bug 留在那也是留在那了 。

就因为 Emoji 为了实现 Emoji 啊 ， 后面呢需要有这么多个支持 ， 所以呢 ， 大家也再一次的再把这些技术再重新再整一遍 ， 来自己再看一下自己写的软件 ， 自己的环境是不是都按标准的 Unicode 去做 。

嗯 ， 像刚才说的那个像国旗啊 ， 国旗它那个对那个字字位处 ， 哎呀 ， 好难念 ， 就是那个 cluster 的那个定义啊 ， 它其实 Unicode 的 8.0 版本和 9.0 版本是有有改进的啊 ，因为在国旗原来原来定义就说凡是国旗 ， 呃 ， 旗和旗 ， 旗凡是两个国旗连在一起 ， 都是被都会被认成一个字的 ， 就是按照原来的定义 。

后来发现好像这样的一一团国旗都被认成一个字 ， 这肯定是不合适的呀 。 所以现在的嗯 9.0 的版本 ， 就是最新的版本 ， 现在就是说就在基数个是可以被断开 ， 那偶数个是不能被断开

， 这样呢保证这个国旗 ， 对啊 ， 现在就这个就就是这样写的 。 就就刚才说一个旗 ， 然后就是给这个旗的这个区 ， 它这个叫 regional indicator 嘛 ， 就都是两两个字母代表组合成一个区域的图嘛 。

**吴涛** [1:25:54]
但不对啊 ， 那个 ISO 的那个国家代码有有三位数组合的 。

**Eric** [1:25:58]
没有 ， 它现在定义都是就是两两两两组合定义成这个 。

**吴涛** [1:26:03]
就那个定那个标准有两个 ，Rio 那个标准有两个 ， 一个是三位 ， 一个两位的 。

**Eric** [1:26:08]
对 ， 就是因为两位不够 ，有两位的不有不够用的 ，有不够用的时候嘛 。 嗯 ， 它是 regional indicator，不是 country indicator 啊 ， 就是嗯 ， 就是就对吧 ， 这个也是个政治的概念了 ， 就是区域和国家 ， 比如中国台湾你怎么办 ， 对吧 ？

**吴涛** [1:26:25]
啊 ， 对 ， 呃 ， 国行的手 ， 呃 ， 国行的 iPhone 是没有那个中华民国的国旗的 。

**Eric** [1:26:34]
这就就就就很奇怪了嘛 ， 对吧 ？ 哼哼 。

**吴涛** [1:26:37]
这个都是可以回避的 。 嗯 。

**Eric** [1:26:39]
啊 ，不过这些都是有那个 Unicode 的这个文档可以引用的 ， 跟关于刚才那个区域和甚至比如说那个引用的那个语言代码也是嘛 ， 大家知道 。

而且语言代码有两位也有三位嘛 ，也是也是 ISO 也有很多层级的嘛 。 嗯 。

**吴涛** [1:26:55]
对啊 ， 对 。

**Eric** [1:26:55]
对 ，也也也要看它它这个 Unicode 它引用的是哪一个 。

**吴涛** [1:27:03]
太坑了 。

**Eric** [1:27:04]
哎 ， 太坑了 。

**吴涛** [1:27:05]
所以大家看了发现其实 Unicode 里面有更多的坑 ， 欢迎大家往里跳 。

**Eric** [1:27:14]
哈哈哈 。

**吴涛** [1:27:15]
不过我好像那天看就是下一版本的 Unicode 好像就是有光头 ， 就是 Emoji， 就就更新 ，不知道它是怎么实现的 ， 这个什么红头发的男孩什么什么的 。

哎 ， 估计下一版的那个 Emoji， 呃 ，iOS 更新的话就可就会上了 ， 大家就可以看了 。

**Eric** [1:27:34]
你给我实现一个红头发的光头男孩出来 。

**吴涛** [1:27:37]
哈哈哈 。 所以我在想它那个头发 ， 就是那个 tag， 那个标签被虽然那个提议被否决了 ， 可是很多实作字体它可以先先出来嘛 ， 那那那后面怎么调用 ， 那那个是它机制后面怎么改的问题了 。

哎

， 好吧 ， 那今天我的我们的主题就差不多了呀 。

### 结尾

**Eric** [1:28:01]
对 ， 嗯 ， 虽然不太清楚这个拯救世界的点是什么 ，不过还是蛮有意思的 。Vida et vasca land 又学到了一些东西 。

**吴涛** [1:28:16]
而且还能拉出你们来做一期节目 ， 多不容易啊 。

**Eric** [1:28:20]
对 ， 我们这个就靠你们续命了 ， 真的是 。

**吴涛** [1:28:24]
哈哈哈

。 好了 ， 你们可以收尾了 。

**Eric** [1:28:31]
OK， 感谢收听 IT 技术与娱乐节目 《 内核恐慌 》。 我们号称 hardcore，但是也没有干货 ， 想听就听 ，不想听就别听 。

您可以为本节目捐款 ， 地址是 colonelpanic.fm/donate， 捐款金额随意 ， 只要是 8 的正整数倍就可以 。 捐款会给你带来什么 ？

不捐也不会让你失去什么 。 我们的口号是 no hard feelings。 啊 ， 如果您有任何反馈 ， 可以发电子邮件到 hi@colonelpanic.fm。

同时也欢迎你收听 Rio 主持的风头圈 ， 我们下期节目再会

。

**吴涛** [1:29:05]
别呀 ， 甄宇你也收个尾啊 。

**Eric** [1:29:08]
啊 ， 啊 ， 逗吗 ？

**吴涛** [1:29:10]
好吧 ， 那也感谢大家 ，也也再次感谢大家收听 。

**Eric** [1:29:15]
甄宇这个捧哏今天一直不在状态吗 ？

**吴涛** [1:29:17]
没有 ， 我刚刚在在看一些 Unicode 的码位 ， 我在看那个 flag 呢 。 我我刚刚发现那个英格兰的那个国旗 ， 嗯 ， 叫国旗吗 ？

它它居然它居然要非常长的一组这个 seconds 才能 ， 对啊 ， 才能实现 。 嗯 ， 它它为什么要这么长啊 ？

**Eric** [1:29:34]
嗯 ， 就是 GBENG 嘛 ，GB 是 Great Britain 嘛 ， 然后 。

**吴涛** [1:29:39]
不不不 ， 它它在前面还要加一个黑色飘动旗帜的那个符号 。

**Eric** [1:29:44]
对啊 ， 这个我觉得就是你可以你不加那个的话 ， 那个旗帜就不是飘动的 ， 它就是个方形的 。 就好像我觉得这个旗帜就是英格兰是个地区旗嘛 ， 就好像我我猜如果有巴登符腾堡州州旗的话也是一样的 。

**吴涛** [1:29:57]
对 。

**Eric** [1:29:58]
但是如果你要加一个什么市旗的话 ，也有可能会会更复杂 。

**吴涛** [1:30:02]
嗯 ， 所以它可能就是呃 ，因此呢 ， 它首先那个飘动的旗 ， 那个旗标就是和那个国旗的那个那个旗是不一样的 。

而且呢 ， 它不仅用了两位 ， 它肯定就是后面有金融是要有三位 ， 然后呢 ， 先用国家 ， 然后再用地区 ， 这样的 。

**Eric** [1:30:20]
对 ， 它不是说要用那个什么 tag 那个来实现吗 ？ 对吧 ？ 它是用那个什么 tag tags 来实现 。

**吴涛** [1:30:27]
这也算是一种 tag 好像 。

**Eric** [1:30:29]
对 ， 就它并不是用那个呃单纯的那个国旗的那个 。 嗯 ， 就它不不算在国旗的那个规范里面 ， 它算在那个 tag 的那个规范里面 ， 对吧 ？

就是它后面加了一个 tag， 这个 tag 用来标明除了这个国家后面的一个具体的地区 ， 这样子的一个组合 。

**吴涛** [1:30:50]
对 。

**Eric** [1:30:50]
它是这样实现的吧 ？

**吴涛** [1:30:51]
对 ，是 ， 应该是这样 。

**Eric** [1:30:53]
嗯 ，是的 。

**吴涛** [1:30:56]
对 ， 所以这个也可以解决刚才 Rio 的那个问题吧 ， 就是说万一两位的这个国家代码不够用的问题 。

**Eric** [1:31:02]
我们节目不是结束了吗 ？ 陈哲宇 。

**吴涛** [1:31:04]
哈哈哈哈哈哈

。

**Eric** [1:31:11]
OK， 好 ， 那也再次感谢大家收听 《 惨字串 》 的电影 。

**吴涛** [1:31:17]
哈哈哈哈 。

**Eric** [1:31:22]
为什么 ？

**吴涛** [1:31:23]
第一封面像 。

**Eric** [1:31:25]
第一第一 64 期节目 。 那也欢迎大家来信跟我们交流和反馈 ， 我们的邮箱地址是 podcast@thechype.com，p-o-d-c-a-s-t at ch-y-p-e 点 c-o-m。 同时呢 ， 大家也可以通过这个邮箱地址在 Paypal 和支付宝上给我们捐赠 。

那么如果大家想在社交网络上关注我们 ， 我们在新浪微博 、Twitter 和微信上的 ID 都是 thechype，t-h-e-t-y-p-e。在 Facebook 上搜索 Type is Beautiful 也可以找到我们 。

好 ， 就到这里 。

**吴涛** [1:31:56]
感谢大家收听 ， 我们下次节目再见 ， 拜拜 。

**Eric** [1:31:59]
拜拜 。

**吴涛** [1:32:00]
嗯 ， 拜拜 。

**Eric** [1:32:01]
拜拜

。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
