# 42. Kerning Panic·字谈字串（二）

内核恐慌 · 2016-07-26

<https://lib.pan.icu/2940718c-2df6-42db-90b3-4e6eed3e6b2b>

本期《内核恐慌》聚焦字符编码发展史，从日本JIS 0201开始，经中国GB2312、GBK到GB18030，再深入Unicode。两位主播拆解了区位码（94×94矩阵）、CJK统一表意文字、基本多语言平面（BMP）及UTF-8/16/32编码。他们剖析了乱码的成因——包括端序内战、BOM标记和编码不兼容——并批评了Windows记事本的混乱选项。节目还涉及韩文KS编码中的汉字重复、新加坡简体的演变，以及emoji编码的争议（如悬浮男士U+1F574）。最终强调UTF-8是最佳实践。

## Questions this episode answers

### 为什么Unicode要将中日韩汉字统一编码，这带来了什么麻烦？

Rio 和吴涛解释，Unicode 为避免重复码位，将中日韩写法相近的汉字合并为 CJK 统一表意文字。但这导致像“户”字在中日韩写法不同（点、横、撇），却共享一个码点，必须依赖字体或语言标记才能显示正确字形，造成多语言混排时的困扰。

[1:11:40](https://lib.pan.icu/2940718c-2df6-42db-90b3-4e6eed3e6b2b?t=4300000)

### 什么是字节顺序标记（BOM），为什么它会成为编码中的坑？

吴涛和 Rio 指出，由于不同计算机架构采用大端或小端序，UTF-16 编码文件开头会加入 BOM（FEFF）以标识字节顺序。但 BOM 原本是零宽不换行空格，不可见且容易引发程序误判，Windows 记事本甚至在 UTF-8 文件也加 BOM，导致兼容性问题，被称为“bad idea”。

[1:32:49](https://lib.pan.icu/2940718c-2df6-42db-90b3-4e6eed3e6b2b?t=5569000)

### UTF-8 编码是如何在数据传输损坏后还能恢复同步的？

吴涛强调 UTF-8 的“self-synchronizing”特性：每个字节的前两位决定其角色。若首位为 0 则是单字节字符起点；若为 10 则是多字节字符的后续部分；若为 11 则是多字节字符起点。这样即使中间字节损坏，程序可快速跳过错误字节，找到下一个合法起点，保证后续文本正确解码。

[1:52:17](https://lib.pan.icu/2940718c-2df6-42db-90b3-4e6eed3e6b2b?t=6737000)

## Key moments

- **[0:00] 开场与反馈**
  - [2:07] 听众「虎飒」纠正：多音字「曲」作姓时念第一声（qū）。
  - [5:28] 手机 vs 掌机：Rio 质疑中文为何区分手持电话与掌上游戏机，吴涛认为只是语用习惯。
  - [7:25] 区位码中的「位」对应英文 cell，即矩阵的行和列。
  - [8:19] 日本称九宫格键盘为「ten key」，因其有十个数字键。
  - [9:49] 欧美国家常将电话号码中的数字映射为字母以方便记忆，例如苹果客服电话 800-APPLE。
  - [11:49] 德语念数字时个位数在前、十位数在后，例如 64 念成 '4 和 60'。
- **[23:09] 乱码**
  - [23:11] 乱码在日语称「文字化け」（Mojibake），英语音译自日语，德语称「符号沙拉」（Zeichensalat）。
- **[26:41] 字符集**
  - [26:43] 日本最早的字符编码 JIS X 0201 于 1969 年制定，在 ASCII 基础上加入了半角片假名。
  - [28:33] 早期日本选择片假名编码而非平假名，是因主要用于电报通信。
  - [29:57] 「假名」意为借来的文字，与「真名」（汉字）相对；韩国不喜欢「谚文」一词，更愿用 Hangul。
  - [31:02] 半角/全角原指视觉宽度，单字节/双字节指编码，后因早期一一对应而混用。
  - [33:06] 制作全角假名是为了在双字节汉字中保持对齐美观，避免半角假名显得突兀。
  - [35:03] 德语因单词长，高速公路路牌大量使用窄体字（condensed）和合字（ligature）。
- **[56:41] Unicode**
  - [56:47] 微软因操作系统发展超前于国家标准，自己推出 GBK 以解决中文显示需求，体现跨国公司推动标准。
  - [59:03] 新加坡早期照搬 GB 2312 作为汉字标准，后废弃自行简化的 67 个汉字，完全采用大陆简体。
  - [1:01:15] 新加坡 1969 年推出 502 简体字表，后因与大陆不同，于 1976 年完全采用中华人民共和国简体字。
  - [1:02:55] Big5（大五码）是港澳台常用的字符集，早期也照搬了日本 JIS 规范并自行扩展。
  - [1:04:07] Windows 系统使用代码页（Code page）管理多语言支持，中文版默认曾为 GBK，后改为 GB18030。
  - [1:06:35] Unicode 旨在统一全球文字编码，但需兼顾各地区既有标准，导致不得不向后兼容。
- **[1:28:51] 编码与端序**
  - [1:29:33] 早期 UCS-2 只编码 BMP，后加入代理对（surrogate pair）机制扩展为 UTF-16 以编码增补平面字符。
  - [1:33:05] 多字节编码存在端序（endianness）问题，分大端序（Big Endian）和小端序（Little Endian）。
  - [1:33:42] 术语「端序」（endian）源自斯威夫特《格列佛游记》中关于鸡蛋应从大头还是小头敲开的争议。
  - [1:36:29] 互联网协议多采用大端序，而英特尔 x86 架构使用小端序，导致网络编程常需字节序转换。
  - [1:39:01] UTF-16 文件开头可选加 BOM（0xFEFF）指示字节序，该字符原本为零宽不留白空格。
  - [1:42:23] Windows 记事本将 Unicode 编码选项称为「Unicode」和「Unicode big endian」，术语混乱。
- **[1:54:50] Emoji**
  - [1:56:24] 「悬浮西装男」🕴️ emoji 源自微软 Webdings 字体，灵感来自乐队 The Specials 的照片。

## Speakers

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

## Topics

字符编码

## Mentioned

Intel (company), Microsoft (company), ASCII (product), Big5 (product), Code page (product), GB (product), GBK (product), ISO (product), JIS X (product), OpenType (product), Source handsense (product), TeX (product), UCS2 (product), UTF-16 (product), UTF-32 (product), UTF-8 (product), Unicode (product), Windows (product), iOS (product), webdings (product)

## Transcript

### 开场与反馈

**吴涛** [0:01]
3，2，1， 开始 。

**Rio** [0:23]
大家好 ， 今天是 7 月 26 号 ，《 字谈字畅 》 的第 26 期 。

**吴涛** [0:28]
同时也是 《 内核恐慌 》 应该是第 42 期 ， 我希望是第 42 期 。

**Rio** [0:34]
或者是 41 期 。

**吴涛** [0:36]
为什么 ？ 不可能吧 。

**Rio** [0:38]
嗯 ，不一定吧 。 对吧 ， 我这个 " 欢迎 " 同时也是 《 内核恐慌 》 第 41 和 42 的纠缠态那一期 。

**吴涛** [0:47]
OK， 大家听到的时候才可以 review 这到底是哪一期 。

**Rio** [0:52]
字谈字畅是全球首家用华语制作的字体排印主题播客节目 ， 我是主播 ， 文川西半东营区 Eric。

**吴涛** [0:59]
我是主播 ， 黄浦江边清真鱼钱真鱼 。 呃 ， 您正在收听 IPN Podcast 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。

我们号称 "Hardcore"，但是没有干货 ， 想听人听 ，不想听人就别听 。 呃 ， 我是吴涛 。

**Rio** [1:11]
我是 Rio。

**吴涛** [1:12]
我就不报画面 。

**Rio** [1:13]
对 ， 我们还没想起那个画面 。 还是 ， 对吧 ， 气势上 ——

**吴涛** [1:16]
哎呀算了吧 ， 何必呢 。

**Rio** [1:19]
但是吴涛上次来我们字谈字畅做嘉宾的时候已经有花名了 ， 我帮他起的 。

**吴涛** [1:24]
我觉得那个还是 ， 对 ， 乘之有愧 。 因为我现在已经不在莱茵河畔了 ， 离多瑙河可能还近一点 ， 所以还是算了吧 。

**Rio** [1:34]
纽伦堡内麦塔狐啊 。

**吴涛** [1:37]
啊哈哈哈 ， 够猛的 。 好 ， 我们程序员 to the bone 不要这一套了 ， 好吧 。

**Rio** [1:46]
今天也没有口号吗 ？

**吴涛** [1:48]
呃 ， 今天好像也没有口号 。 Heroes never die.

**Rio** [1:53]
哈哈哈 ， 太扯了 。 好了 ， 呃 ，《 字谈字串 》 啊 ， 我们这是第二期节目 。在第二期节目正式进入主题之前 ， 我们先来看一下第一期 《 字谈字串 》 有一些听众反馈 ， 对吧 ， 振宇 ？

**吴涛** [2:07]
嗯 ，是 。 那我来说一下 。 首先我们收到了一封邮件 ， 呃 ， 一位署名叫 " 虎飒 " 是吧 ， 这个字母 。

**Rio** [2:17]
对 。

**吴涛** [2:17]
" 虎飒 " 的一位听众给我们的反馈是 ： 纠正读音的这个老传统啊 。 她说 ：" 四位主播好 ， 再次小小纠正一下 ： 吃线的吃念吃 ， 歌曲的曲念曲 。"

好吧 。

**Rio** [2:29]
为什么 ， 为什么 ？

**吴涛** [2:30]
好吧 。 哈哈哈 ， 别问为什么 。 就是这样 ， 多音字就是这样 。

**Rio** [2:35]
哈哈哈 ，OK。 啊我明白了 ， 曲 ， 曲是 curve， 然后曲是 melody。

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

**Rio** [2:42]
啊 ，song。

**吴涛** [2:42]
嗯嗯嗯 。 好吧 。 这可能跟以前什么 " 一个是动词一个是形容词 " 有关系 。 或者一 。

**Rio** [2:50]
对 。

**吴涛** [2:50]
一个是名词 ， 一个是名词 ， 一个是形容词 。

**Rio** [2:54]
好像不是 。

**吴涛** [2:54]
嗯 ， 曲 ， 曲线是从九曲十八弯的那个曲来的 ， 对吧 ？ 就是拐弯的意思 ， 对吧 ？

**Rio** [3:00]
对 。

**吴涛** [3:01]
啊 ， 曲是 ， 曲是歌曲的曲 。

**Rio** [3:05]
对啊 。 所以刚才你又念错了 ，是曲线嘛 。 九曲十八弯 。

**吴涛** [3:10]
对对对 。 啊我念的是九曲 ， 九曲十八弯 。

**Rio** [3:13]
对对对 。 你变成那个曲嘛 ， 勾曲那个曲了 。

**吴涛** [3:17]
这个字 ， 这个字本意是指什么 ？ 这个字本来指的是弯曲还是歌曲呢 ？

**Rio** [3:25]
本意应该是弯曲 。

**吴涛** [3:27]
然后歌曲是引申义 。 指示字一开始是指一个弯 ， 一开始指一个 ， 嗯 ， 弯折了的事物 。

**Rio** [3:37]
对啊 ， 所以还是弯是 ， 弯曲是它的本 ， 这个词源本义 。

**吴涛** [3:43]
OK， 所以音乐是引申义 。

**Rio** [3:46]
所以它还有一个意思 ， 就是我们都有用过的嘛 。 就是你们 ，在你们猜一下， 用这个用途的时候念哪个音哈 。

就是用那个发酵做酒的那个东西 。

**吴涛** [3:55]
曲吧 。

**Rio** [3:56]
那是另一个字了 。

**吴涛** [3:57]
那是 ， 那是另外一个词简化来的吧 ？

**Rio** [4:01]
对 ，但那是另一个词 。

**吴涛** [4:02]
就繁体它是有个麦字的旁的嘛 。

**Rio** [4:04]
对对对 ， 那其实是另一个词 。

**吴涛** [4:06]
那个其实念曲 。

**Rio** [4:07]
念曲 。

**吴涛** [4:08]
医生 。

**Rio** [4:08]
OK。 医生 。

**吴涛** [4:10]
医生 。

**Rio** [4:11]
对 。 对 ， 第一声 " 曲 "。

**吴涛** [4:12]
对 。

**Rio** [4:13]
对 。

**吴涛** [4:13]
九曲啊 ， 什么洋河大曲 ， 哎 ， 广告 。

**Rio** [4:17]
哈哈哈 。

**吴涛** [4:18]
没说钱 。

**Rio** [4:19]
一会儿得闭掉 。

**吴涛** [4:19]
闭掉 。 呃 ， 然后还有一个 ， 曲 ，是另外一个字 ，是麦字旁 ， 一个菊花的菊 ，不要那个草字头 。

**Rio** [4:31]
啊 ， 那也是 ， 那也是那个 ， 就是酵母嘛 。

**吴涛** [4:35]
对对对 ， 就这个是 ， 这个是这个曲 ， 就九曲这个曲的一体字吧 ， 好像是 。

**Rio** [4:41]
没有 ， 所以你现在说的就是说 ，其实原来繁体字是三个字 ， 然后简化成就变成一个字而已 。

**吴涛** [4:47]
呃 ，不 ， 那个是用九曲的那个曲是简化成了这个东西 ，但是前面那个弯曲和这个小曲儿 ， 它们好像原始就这样吧 。

**Rio** [4:58]
对对对 ， 它们原来是两个字嘛 ， 就是 。

**吴涛** [5:01]
没错没错 。

**Rio** [5:02]
现在被那个简并成了一个字 。

**吴涛** [5:04]
啊 ， 这个还可以是一个姓 。

**Rio** [5:06]
好 ， 那考你们了 。 用作姓的时候它念几声 ？

**吴涛** [5:10]
曲 。 对 ， 曲 。 应该是念医生吧 。 曲 ， 曲阳嘛 。 就是我记得那个 《 笑傲江湖 》 里面某派掌门人是不是就姓曲 ？

**Rio** [5:18]
对对对 ， 念 ， 用作姓是念医生的 。

**吴涛** [5:21]
对 。

**Rio** [5:22]
好吧 ， 这个中文真是坑爹啊 。 哎 ， 我问你们一个事 ， 那天 ， 那天 ， 那天我问到 ， 那天我想到的 。

你说手机和掌机有什么区别 ？

**吴涛** [5:33]
掌机是 。

**Rio** [5:34]
掌 。

**吴涛** [5:34]
Handheld， 游戏机 ， 掌上游戏机的 。

**Rio** [5:37]
对 ，但是手机呢 ？

**吴涛** [5:39]
手机是指手上电话机 ， 手持电话机 。

**Rio** [5:45]
然后我问你 ， 这是一个没有这个 ， 这个 context 基础的外国人来学中文 ， 你说他怎么区分这两个东西呢 ？

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

**Rio** [5:54]
哎 ，但是英文里面有 handset 这个词吧 ？

**吴涛** [5:56]
有 ， 就德语里面手机是 handy 嘛 ， 对吧 ？

**Rio** [6:00]
对 。

**吴涛** [6:00]
然后那个 ， 最早的那个 PDA 是 palm， 对吧 ？

**Rio** [6:04]
对 。

**吴涛** [6:05]
Palm 就是掌嘛 。

**Rio** [6:07]
嗯 。

**吴涛** [6:08]
掌机 ， 怎么说 ， 什么时候变成游戏机了 ？

**Rio** [6:10]
掌上游戏机啊 。

**吴涛** [6:11]
对嘛对嘛 。

**Rio** [6:12]
这不是变了 ， 这是个缩写嘛 ， 这是个简称嘛 。

**吴涛** [6:15]
那手机呢 ？

**Rio** [6:16]
手持仪 ， 手持电话机啊 ， 我刚才不是说了吗 ？

**吴涛** [6:19]
啊 ， 原来是这么来的 。

**Rio** [6:19]
那手持和掌持有什么区别 ？

**吴涛** [6:22]
掌上和手持 。

**Rio** [6:23]
就 ， 我就说 ， 没有 ， 就是手持和掌上有什么区别 ？

**吴涛** [6:27]
呃 ，其实没有太大的区别了 。 因为这只是一个语用的习惯吧 ， 至少在我看来 。

**Rio** [6:33]
就是嘛 ， 所以说我所以很坑嘛 ， 就是没有 ， 没有任何理由 。 因为它 ， 你说手上拿个电话和手上拿个游戏机有本质区别吗 ？

**吴涛** [6:41]
掌上电话这个说法好像 。

**Rio** [6:43]
对啊对啊 ，但其实这个问题在 ， 在英文里也会出现 ， 比如给你一个首字母缩写的词 ， 它有可能代表了多个词 ， 你必须有一个语境才可以去解读它 。

**吴涛** [6:53]
对对对 ， 我就是说这个 ， 就是中文有时候就是得靠这种 context 去积累 ， 没有 ， 没有什么 。

**Rio** [6:59]
不 ， 任何语文 ， 任何语言都一样 。

**吴涛** [7:01]
哎 。

**Rio** [7:02]
你给你一个 cell， 你没有上下文 ， 你怎么知道它指的是球室还是 ， 还是 。

**吴涛** [7:07]
细胞 ， 还是 。

**Rio** [7:09]
还是那个 。

**吴涛** [7:09]
通 。

**Rio** [7:10]
不是 ， 通讯的那个 ， 通讯网络 。

**吴涛** [7:11]
通信 。

**Rio** [7:12]
嗯 。

**吴涛** [7:13]
啊 。

**Rio** [7:13]
对吧 ？

**吴涛** [7:14]
但这两个是同源的呀 。

**Rio** [7:15]
而且在我们今天的这个话题下，cell 好像在中文里还被翻译成位是吧 ？ 比如那个吃味码的位其实指的就是 cell。

**吴涛** [7:25]
啊 ，是这样的吗 ？

**Rio** [7:26]
对 ， 吃味码就是 row-cell 的意思 。

**吴涛** [7:29]
哦 。

**Rio** [7:29]
OK。

**吴涛** [7:30]
哦 ，good to know。 哈哈哈 。

**Rio** [7:36]
嗯哼 。 第二个是在 TIB 的这个帖子下面给我们留言的 。其实有两位给我们留言 ， 一位说有关 ， 呃 ， 这位的署名叫 Jeonayoon，他应该是一位韩国人 ？

**吴涛** [7:50]
这也是我们听众吗 ？

**Rio** [7:51]
嗯 ， 对 ，但看他这个姓的写法有点像韩国的 ，是吧 ？

**吴涛** [7:55]
嗯 ， 你们这么国际化 。

**Rio** [7:57]
姓 ， 姓尹 。

**吴涛** [7:59]
嗯哼 。

**Rio** [7:59]
嗯 ，他说有关键盘键位和键位的映射等移动设备貌似又是一般风景了吧 ， 各国的酒店布局之类的 。他的意思就是说 ， 呃 ， 我们那期说到键盘和键位映射的时候 ， 没有提到这个酒店布局的键盘 。

**吴涛** [8:17]
酒店是那个九宫格那种啊 ？

**Rio** [8:19]
对 ， 应该是吧 。

**吴涛** [8:20]
就 Ten key 嘛 ，是那个字吗 ？

**Rio** [8:22]
在英文里面叫 Ten key 吧 。

**吴涛** [8:24]
是叫 Ten key 嘛 ， 对 ， 十键 。

**Rio** [8:27]
嗯 ， 日语叫 ten key。

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

**Rio** [8:28]
为什么是 ten key 呢 ？

**吴涛** [8:30]
因为 1234567890 嘛 。

**Rio** [8:31]
就是十个件吧 。

**吴涛** [8:32]
里面有 0， 为什么叫九宫格 ？

**Rio** [8:35]
哈哈哈 。

**吴涛** [8:36]
它是一个 ， 它是一个 ， 一般来说是一个三乘四的矩阵嘛 ，但是 。

**Rio** [8:41]
对啊 ， 应该是 12 个键嘛 。

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

**Rio** [8:43]
哎 ，在那个 ， 呃 ， 就英文版的那个 iOS 里面 ， 你加那个九宫格键盘 ， 它英文也是叫拼音 ， 然后十 ， 就是 ten key， 十个 ， 十键这个 。

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

**Rio** [8:54]
Make sense。

**吴涛** [8:56]
所以其实这里有一个问题是这样的哈 ， 我一直很不确定这种触屏的 ， 这种屏幕上的输入法 ， 它有那个就是 code， 叫什么 ， 那个 keycode 这概念吗 ？

应该没有了吧 ？

**Rio** [9:07]
触屏上面应该没有吧 ，但是以前 ， 呃 ， 就是电话机上是什么怎么实现的 ？

**吴涛** [9:12]
电话机是模拟信号 。

**Rio** [9:14]
啊 。

**吴涛** [9:14]
电话机以前是靠声音长短时间 。

**Rio** [9:17]
对对对 。

**吴涛** [9:17]
做了个 modem 那种方式了 。

**Rio** [9:20]
对 ， 所以其实我们可以认为这个酒店布局的这个键盘 ， 它相当于是含了一层这个输入法嘛 ， 如果它不只是输入数字的话 。

**吴涛** [9:31]
可以这么理解 ， 对 。

**Rio** [9:32]
而且那个还挺复杂的 ， 它比如说那个 ， 那个 ten key 上面不是每个键它有三个字母吗 ？ABC， 然后 DEF 这种 。

然后就是 ，其实在欧美生活的人很多都知道 ， 就是他们会那个电话号码它不会写 ， 比如中国都是号 ， 比如 8888， 然后 6666 这种什么比较好记的数字嘛 。

但他们会很取巧的直接把那个转写成它需要的那个字母的组合 。 比如说那个苹果的那个 ， 那个 800 电话 ， 它写的是 800， 然后 Apple， 对吧 ？

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

**Rio** [10:02]
那你就 ， 你就照着那个 ten key 上面 ， 比如你拿出你的那个 ， 那个手机嘛 ， 然后你找那个拨号那个键盘 ， 你看它每个键 。

**吴涛** [10:10]
就是 。

**Rio** [10:10]
上面写的是 。

**吴涛** [10:11]
A 是 2 嘛 。

**Rio** [10:11]
对 ， 你就按 A 嘛 ， 然后就是 2， 对吧 ？

**吴涛** [10:13]
7 是 7 嘛 。

**Rio** [10:14]
你按两下， 就 277。

**吴涛** [10:16]
277。

**Rio** [10:17]
53。

**吴涛** [10:18]
53。

**Rio** [10:18]
对对对 ， 就打到是 ， 比如说就是苹果的一个客服电话 ， 就很多厂商啊 ， 就会去做这么一种转化嘛 。

但是好像我中国从来没见人这么用过 。

**吴涛** [10:28]
嗯 ， 毕竟不是一个拉丁字母为基础的国家嘛 。

**Rio** [10:32]
但这个 ， 我这个其实我觉得这个还挺 ， 挺有用的 ， 就比较好记 。 就是 ， 你看如果像中国记一个电话号码 ， 就只能 ， 只能死记硬背号码 ， 或者是用这个 ， 呃 ， 谐音嘛 。

所以各种连号啊 ，8 啊 ，6 啊 ，0 啊什么的 ， 就大家特别喜好 。

**吴涛** [10:48]
我觉得一个问题 ， 一个 ， 一个很大的问题就是中文的那个 ， 中文 ， 中汉语记数字太方便了 。

**Rio** [10:55]
记数字太方便 ， 啊对 ， 就全部都是单音节字 。

**吴涛** [10:58]
对 ，而且就是我在 ，因为你猜欧洲一般都会格写吗 ？ 就是法国会两位两位格写 。

**Rio** [11:04]
我又想到 。

**吴涛** [11:04]
又要开始法 ， 法黑法格 。

**Rio** [11:06]
又要跟法黑 。 哈哈哈 。 但是德语里面也是个位数先念的是吧 ？ 如果是几十几的话 。

**吴涛** [11:13]
不一定 ， 念 ， 念 ， 念电话一般不会那么复杂 ， 就电话看情况嘛 。 但是当然有些人也是两位两位的念 。

**Rio** [11:21]
记数的话 ， 就德语跟英文是比较相近的吧 ？

**吴涛** [11:25]
就除了最末两位比较坑爹之外 ，其他还好 。

**Rio** [11:28]
对啊 ， 德语 ， 德文里面那就是最末两位就是它要先念个位数再念十位数是吧 ？

**吴涛** [11:33]
英文也是一样的吧 ？

**Rio** [11:35]
那英文是 64， 比如说 sixty four 嘛 ，64 嘛 。 但是德文 ， 德文是倒过来的吧 ？

**吴涛** [11:42]
德文是 4 和 60。

**Rio** [11:44]
对啊 ， 德文是倒过来的 ，4，60。

**吴涛** [11:46]
啊 ， 你说这个意思 。

**Rio** [11:47]
对 。

**吴涛** [11:47]
OK。

**Rio** [11:48]
嗯 ， 德文是倒过来的 。

**吴涛** [11:49]
嗯 ， 就只有最后两位不一样 。

**Rio** [11:51]
啊 。 但 ，但其实就是一个念法的问题嘛 。 比如说中文里面会说三个 5， 然后英文里面会说 triple five， 对吧 ？

然后说两个 8， 你会说 double eight。 然后如果比较长的数字的话 ，其实一般都是一组一组念的 ， 就是两位数两位数的念嘛 ， 英文里面 。

**吴涛** [12:09]
法国人要说四个 20 加 8。

**Rio** [12:12]
然后脑子里面全乱了 ， 一团浆糊 。 还得先把那个电话号码拆成一个数 ， 然后这个叫什么来的 ？

哎 ， 那个数论叫什么来的 ？ 就是每一个 ， 每一个自然数可以拆成什么几个数 ， 就是那个质数的那种什么 ， 就 power 的组合嘛 。

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

**Rio** [12:30]
叫 Fundamental Theorem of Arithmetic。 中文叫算术基本定理 。

**吴涛** [12:38]
算术基本定理 ？

**Rio** [12:39]
算术基本定理 ， 它就是说 。

**吴涛** [12:41]
每个大于 1 的自然数均可以写为质数的积 。

**Rio** [12:45]
对 。

**吴涛** [12:45]
而且这些因 。

**Rio** [12:46]
就它有一个唯一的表示 。

**吴涛** [12:48]
因子 ， 然后大小排列之后只有一种表示 。

**Rio** [12:50]
哎 ， 这跟后面那个我们要讲的那个 Unicode 有关吗 ？

**吴涛** [12:52]
这不就是质因数分解吗 ？

**Rio** [12:54]
呃 ， 还不一样 ， 还不一样 。

**吴涛** [12:56]
不一样 ？

**Rio** [12:57]
嗯 ， 它 ， 它讲的是另外一个事 。 就说其实这个跟我们后面要讲的那个 Unicode 的那个 normalization 有点关 ，有 ，有点 ， 一 ，有点异曲同工的意思 。

**吴涛** [13:05]
OK。

**Rio** [13:05]
对 。

**吴涛** [13:05]
对 。

**Rio** [13:06]
所以你要先 ， 首先是这是正整数嘛 ，而且你要先 ， 先要断定出什么是质数嘛 。

**吴涛** [13:12]
对对对 ， 然后它有一种唯一的分解法 。

**Rio** [13:15]
嗯嗯 ， 对 。

**吴涛** [13:16]
然后这个 ， 这个就是算术基本定理嘛 。

**Rio** [13:19]
我们为什么从键盘扯到这边来 ？

**吴涛** [13:22]
对啊 ， 为什么扯到这边来 ？

**Rio** [13:23]
啊 ， 说 ， 说法国人拆那个数 。

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

**Rio** [13:26]
好吧 ，OK。

**吴涛** [13:28]
各国念这个电话号码的习惯应该是 ， 呃 ，有一定的规律的了 。 我记得 Wikipedia 还有一个页面是专门汇总各国的这个习惯的 。

**Rio** [13:38]
你看 ， 所以是 ， 哎 ， 你们念中国的手机号是先念 ， 就是比如说 。

**吴涛** [13:43]
呃 ， 三四四 ， 一般是三四四这样的规则 。

**Rio** [13:46]
OK。

**吴涛** [13:46]
不 ， 看那个吧 。

**Rio** [13:47]
有很多人是三三五是吧 ？

**吴涛** [13:48]
看那个 ， 看那个 ， 就是叫什么 ， 就区号的区 ， 区分嘛 。 比如说中国的手机号码都是统一 ， 都是 11 位嘛 ， 都是 344 嘛 。

然后那个座机号码就不一定了 ，因为有些地区是最开始是 ， 这还有历史 ，有五位 、 六位 、 七位 、 八位的嘛 。

**Rio** [14:04]
对 ， 现在基本都是八位了 ， 八位就是四四四 。

**吴涛** [14:07]
四四四嘛 。

**Rio** [14:08]
像小程序 。

**吴涛** [14:09]
而且主要是 ， 还有它有那个 ， 就是长途电话的区号嘛 。 区号理论上讲就是三位或者四位嘛 。

**Rio** [14:15]
中国是三位或者四位的 。

**吴涛** [14:17]
嗯 ， 对 ， 日本是有两位的 。

**Rio** [14:20]
因为小 。

**吴涛** [14:21]
呃 ， 区号其实是那个两位或三位 ， 然后补一个 0， 对吧 ？

**Rio** [14:25]
就国内拨是补 0 嘛 。

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

**Rio** [14:27]
要跟那个国际长途分开嘛 。

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

**Rio** [14:31]
哎 ， 这个很多人不知道这个事情 ， 就是怎么拨那个国际长途啊 。 就为什么是区号都是 0， 然后一个什么 。

**吴涛** [14:37]
要 ， 要 ， 要 ， 对 ， 要省掉那个 0， 对吧 ？

**Rio** [14:39]
不是 ，是 。

**吴涛** [14:40]
不 ，有些国家是不省的 。

**Rio** [14:41]
不是 ，不是 ， 中国 。

**吴涛** [14:42]
对 ， 省不省是看那个电话规则 。

**Rio** [14:45]
不是 ，是这样的 ， 中国是这样的 ， 就说如果中国你拨 0， 然后你再加一个数字的话 ， 就 ， 就 ， 啊不 ， 首先如果你拨本地 local number， 就不需要拨区号的话 ， 它肯定不会 ，不会是 0 开头的 ， 对不对 ？

然后如果你要拨另外一个区的话 ， 你肯定是 0 加一个非 0 数字开头的 ， 这它就知道你是在拨区号了 ， 对不对 ？

但是你拨 00 的话 ，其实就是变成那个所谓的那个加号嘛 。

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

**Rio** [15:09]
那这个加 。

**吴涛** [15:10]
就是国际 。

**Rio** [15:10]
就是国际的那个 prefix， 就它是这么来区分的嘛 。

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

**Rio** [15:13]
OK。 然后这个时候就牵涉到一个表 ， 表达的问题了 ， 就是说比如说我们中文 ， 中国会写 ， 假设比如说深圳是 。

**吴涛** [15:20]
0755。

**Rio** [15:21]
0755， 对对对 ， 深圳是 0755， 对吧 ？ 但是如果说你从外国打到深圳的话 ， 你是拨 0086，86 是中国的那个国际区号代码嘛 。

然后这个时候你就不会要 ，不会拨 075， 你只会拨 755，因为前面 86 已经确定了你是这个中国 ， 然后你要在下面就跟着要拨区了嘛 ， 对吧 ？

所以你看很多人写那个名片上的表达 ，他会写加号 ，86， 然后 0 括号 ， 表示括号表示 optional 是可选的嘛 ， 然后是 755， 最后面再跟一个 。

**吴涛** [15:50]
我也是这样 ， 你确定这个 0 是可选的吗 ？ 就是我 ， 我的理解是不是每个国家打这个 ， 就是不是从每个国家打外国的电话的时候 ， 这个 0 都是可以省略的 。

**Rio** [15:58]
中国是 ， 呃 ， 中国是可选的 ， 反正 。

**吴涛** [16:00]
没有 ， 绝大多数都是的 。 就我的经验来讲的话 ， 只有意大利不行 ，因为就意大利他们本身那个号就是 ， 就是有一个 0， 所以那个 0 就不用省 。

**Rio** [16:09]
就是它的开头是 0，有 ，0 开头的这个 。

**吴涛** [16:12]
对 ， 对 ， 就是意大利这样 。

**Rio** [16:14]
OK。

**吴涛** [16:14]
啊 ，其实是有一份国际标准的 ， 就是国际有个叫 ITU 的 ， 跟通信有关的组织 。

**Rio** [16:21]
国际通信联盟吗 ？

**吴涛** [16:21]
它对这个电话号码的注记格式 ， 对 ， 它对这个电话号码的注记格式 ， 包括有些 0 是不是可以放在括号里 ， 就是可选的这个格式 。

**Rio** [16:30]
对对对 。

**吴涛** [16:30]
首先它的书写是有一个规范的 ，其次就这个书写对应的规范其实是跟各国的这个电话制式的有关的 。

**Rio** [16:38]
对对 。

**吴涛** [16:39]
其实这个电话号码要不要加 0， 这个 0 可不可以省略 ，以及它是不是可选的 ，其实是跟那个模拟时代的这个通信的原理有关 。

**Rio** [16:48]
就那个叫什么成空机的那个东西是吧 ？

**吴涛** [16:50]
这应该是可以查证的 ， 只是 ， 呃 ， 我以前学的一些东西有点记得不太清楚 。

**Rio** [16:56]
对对对 ， 这个时候要透露那个你的底牌了吗 ？

**吴涛** [16:59]
没有 ， 没有 。

**Rio** [17:01]
我们真语的专业 。

**吴涛** [17:03]
其实是 。

**Rio** [17:05]
好吧 ，其实那个这个跟通信比较相关 ，但我的专业虽然有一些跟通信相关的东西 ，但还离得有一点远 ， 只是会顺带的学到一些 。

**吴涛** [17:16]
听众朋友们 ， 我郑重的告诉你们一个惊人的事实 ，在座的四位主持里面竟然全部都是具有理工科背景的 。

**Rio** [17:24]
这很惊人吗 ？

**吴涛** [17:26]
这不是很正常吗 ？

**Rio** [17:27]
我一直以为你们两个是文科生 。

**吴涛** [17:29]
我可能太看不起他们了 。

**Rio** [17:31]
你不能因为他们两个是弹子唱的就看不起他们吧 。

**吴涛** [17:36]
哈哈哈 。

**Rio** [17:36]
你要看不起文科生 。

**吴涛** [17:38]
不是 ， 这不是 ， 这个是一个 ， 这个是一个什么来的 ， 所谓这个什么物以类聚 ， 人以群分 ， 所以我们要搞这个什么大串联嘛 。

结果发现串来串去还是一伙人。

**Rio** [17:49]
你对文科生有什么幻想吗 ？

**吴涛** [17:52]
不 ，因为 ，因为觉得特别文艺嘛 ， 就这个挺好的 ， 就缺这个东西 。

**Rio** [17:56]
自然自唱不文艺 。

**吴涛** [17:58]
Rex 是学什么的 ？Rex 以前 ，Rex 之前念了 ， 念了一个博士 ， 那个哲学的博士 ， 现在 。

**Rio** [18:05]
Rex 应该是我们这里比较偏 ， 呃 ， 社科类的吧 。

**吴涛** [18:10]
哎 ， 我也是这样 。

**Rio** [18:10]
对 。

**吴涛** [18:11]
Rex 是念哲学硕士应该是 ， 之前他是本科学 ， 学经济的好像 。

**Rio** [18:17]
啊 ， 还好 ， 还好 ， 还好 ， 终于 ， 终于有一个非 ， 非理工背景的人。

**吴涛** [18:22]
哈哈哈 。Rex 不愿意上咱们的节目啊 。

**Rio** [18:27]
对啊 ，Rex 好像都没有出现过 ， 怎么一回事 ？

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

**Rio** [18:30]
他连自弹自唱都没有上 。

**吴涛** [18:32]
没错 。

**Rio** [18:33]
太不 ， 太不给面子了 。

**吴涛** [18:35]
耶 。

**Rio** [18:35]
没关系 。 主编大人出场的话要有一个隆重的仪式 ， 我已经给他安排好话题了 ， 请大家期待 。

**吴涛** [18:41]
OK，OK， 非常好 。

**Rio** [18:45]
好 ， 我们推进到最后一个听众反馈 ， 最后一个 ， 最后一个也是在 TIB 上给我们的留言呢 。他的 ID 是 Link Zero， 然后他说说到反斜杠 ， 我首先想到的是 TeX。

我们上期其实提了一下 TeX，但没有细讲啊 。TeX 在反斜杠里就是作为转义符吗 ？ 还是什么 ？

**吴涛** [19:06]
反斜杠在 TeX 里作为转义符 ， 对 ， 没错 。 就是以反斜杠开头的一个 ， 一个 ， 呃 ， 标志符 ， 然后后面可以可选 ， 用花括号 ， 方括号的一个 parameter。

**Rio** [19:18]
嗯 。

**吴涛** [19:19]
嗯 ，在 TeX 里面还有一些什么希腊文字母也都是用 ， 都是 ， 就像转义符一样 ， 都用反斜杠开始用 。

**Rio** [19:26]
对 。 说到这个反斜杠 ， 我 ， 我上次终于见到有人真人在我现实生活中的一个朋友 ，他用反斜杠表示 ， 或者就是 A 或者 B 那个 。

**吴涛** [19:35]
上海很多 。

**Rio** [19:37]
哈哈哈 。

**吴涛** [19:37]
不是在现实生活中， 就是不是在魔 ， 魔幻都市里 ，而是在 。

**Rio** [19:43]
哈哈哈 。

**吴涛** [19:45]
是的 。

**Rio** [19:45]
上海人就这样被你 ， 被你抛离了现实生活 。

**吴涛** [19:49]
哈哈哈

。

**Rio** [19:53]
对 ， 反正我还当时看了还是蛮 ， 蛮吃惊的 。 我 ， 哎 ， 我都很想问说 ， 哎 ， 为什么要用这个 ？

**吴涛** [19:58]
不 ， 为什么你还没说清楚他 ，他在什么样的情况下用了这个 ？

**Rio** [20:02]
就是他写两个选项 ， 我们说比如说 ， 呃 ， 就中文里面你会写 A 或者 B 的时候 ， 你会把它那个斜杠把它表示选项嘛 。

**吴涛** [20:11]
他是在手写还是在 ， 呃 ， 打字的时候 ？

**Rio** [20:14]
呃 ，是那个打字 ， 对 ， 打字的时候 。 而且他两种混用 ， 关键是你知道吗 ？

**吴涛** [20:19]
骗的 。

**Rio** [20:20]
所以他在他看来这个左滑右滑其实是一样的 。

**吴涛** [20:22]
就是 B 死处女 ， 处女座嘛 。

**Rio** [20:25]
但其实想一下好像也没什么区别 ， 就是左滑和右滑有什么区别吗 ？

**吴涛** [20:28]
确实没什么区别 。 再做有处女座吗 ？

**Rio** [20:30]
没有 。 但是我不能容忍这样 ， 就是 ， 尤其是在一 ， 一篇文章里面就混用这个东西 。

**吴涛** [20:38]
对 ， 它其实是个约定了 ， 就是你单纯从这个作用上来说 ， 你用左 ， 左斜和右斜都是能起到同样的作用 。

**Rio** [20:45]
那我 ， 我问一个问题哈 ， 你说在那种 ， 呃 ， 阿拉伯文这种从右向左写文字里面它用什么 ？

**吴涛** [20:52]
阿拉伯文的逗号都是 ， 都是往 ， 往 ， 往右逗的 ， 你知道吗 ？

**Rio** [20:56]
刚好做了个镜面对称 。

**吴涛** [20:58]
对 ， 还有阿拉伯文的问号也是 ，也是 ，也是镜面对称的 ， 就是那样 。

**Rio** [21:02]
哎 ，不 ， 那你解释一下你们德国为什么前面那个引号要放在下面 ？

**吴涛** [21:05]
这就是德意志的传统 。 哈哈哈 。 就是从那个哥特文字 ， 就是从那个哥特体的时代 ，Blackletter 的时代 ， 那个引号就一直是在那的 。

**Rio** [21:15]
就左下右上对吧 ， 应该是 ？

**吴涛** [21:17]
对 ， 就一开始是在左下 ，而且那个引号引的方向也是反的 。

**Rio** [21:22]
然后中文的那个方括号是左上右下对吧 ？

**吴涛** [21:26]
这个比较 make sense， 中文竖排的时候 ， 那个就是一个符号也是应该从左上角开始写嘛 ， 那所以写括号好像也应该在左上角 。

**Rio** [21:35]
啊 ， 竖排是右上左下 。

**吴涛** [21:37]
What？

**Rio** [21:37]
对 ， 竖排是右上左下 。 对 。

**吴涛** [21:39]
哈哈哈 。

**Rio** [21:40]
为什么呢 ？ 竖排右上左下的话符合就是笔顺 ， 如果你是左上的话就变成要运笔的话就完毕 。

**吴涛** [21:49]
要写完笔的话 。

**Rio** [21:49]
对对对 。 嗯 ， 你右上左下的话就符合书写的笔顺 ， 就是横折嘛 ， 就是横折和竖折 。

**吴涛** [21:57]
Make sense。

**Rio** [21:57]
这也是假设是右 ， 右利手的情况下 。

**吴涛** [21:59]
但是 ， 呃 ， 中文默认都是这样的 。 左利手你也不可能从左下开始写一个 ， 呃 ， 条 ， 然后右折嘛 。

**Rio** [22:08]
都很怪嘛 ， 就是 。 中文的基本笔画顺序叫从左往右 ， 从上到下嘛 。

**吴涛** [22:13]
那比如说阿拉伯文那些是默认是左利手吗 ？

**Rio** [22:16]
也不是 。

**吴涛** [22:16]
因为他们的运笔的话要 ， 要从右往左画嘛 ， 就是横要往右往左画横 。

**Rio** [22:21]
但阿拉伯人大部分也是右利手呀 。

**吴涛** [22:24]
嗯 ，但我 ， 我只是说文 ， 就是文字 ， 从文字上下 。

**Rio** [22:28]
嗯 ， 所以还是一个习惯问题 。

**吴涛** [22:30]
OK。

**Rio** [22:31]
还是一个习惯问题 。

**吴涛** [22:32]
嗯 ， 就没有什么不能改的是吧 ？

**Rio** [22:35]
就可能有一定的偶然因素 。

**吴涛** [22:37]
所以汉字 ， 汉字的运笔的话默认是从左往右 ， 比如说你写一个口 ， 口的最后一笔的话 ， 你不可能就我就顺便第一 ， 就第二笔画 ， 画 ， 画 ， 画回来从右往左就连成一笔 ，不能这样的 。

你要另外起第三笔从左往右写 。

**Rio** [22:53]
哈哈哈 。

**吴涛** [22:53]
那是在画圈 。

**Rio** [22:54]
就是中文默认只能从左往右嘛 ， 它没有从右往左的笔画 ， 中文 。

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

**Rio** [23:00]
OK， 明白 。

**吴涛** [23:02]
好吧 ， 这样我们终于花了半个小时的时间 。

**Rio** [23:05]
把反馈说完了 ， 那我们现在终于可以进入正题了 。

**吴涛** [23:09]
OK。

### 乱码

**Rio** [23:11]
我们上次第一期节目把从头到尾大概过了一遍 ， 嗯 ， 我们敲下一个键盘 ， 然后让一个字显示在屏幕 ， 最后打印出来终于发生了什么 。

那我们现在呢 ， 终于可以开始拆开来一步一步讲了 。

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

**Rio** [23:28]
嗯哼 。

**吴涛** [23:29]
但今天讲的好像也不是键盘吧 。

**Rio** [23:32]
今天我们讲什么 ？ 讲乱码是吗 ？

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

**Rio** [23:36]
这个有点像 ， 这个有点像从显示开始了 ， 从先 ， 先从显示的这个这一层面来讲 ， 为什么有时候会看到我们不想看的东西 ， 或者我们想看的东西显示出来是错误的 。

**吴涛** [23:48]
嗯 ，其实首先这个概念哈 ， 就是客户 ， 呃 ， 就是从用户来讲的话 ，他显示不正常他就觉得是乱码 。其实这个乱码它背后有很多不一样的道理 ， 对吧 ， 就是因为如果你一直从那个字面上来讲 ， 乱码就是首先你有个码 ， 然后那个码不对了就变成乱码 。

可是呢 ， 实际上呢 ，并不 ，并不一定完全都是码的问题 ，有时候还有这个字库显示的问题或者其他问题 ， 对吧 ？

**Rio** [24:16]
嗯 。

**吴涛** [24:16]
哎 ， 英语里面管乱码叫什么 ？

**Rio** [24:18]
不知道哎 。

**吴涛** [24:20]
英语里面会有乱码吗 ？

**Rio** [24:21]
对 ，因为英文里面就有 ASCII 嘛 ， 所以呢 ， 它们不存在乱码 。 而且呢 ， 就是说乱码也就是我们 ， 我们双字节开始的 。

所以呢 ，在日本来讲呢 ， 日本他们说在英文世界里 ，他们都把乱码叫成 Mojibake，是我们日语传过去的 。

**吴涛** [24:35]
叫什么 ？

**Rio** [24:37]
哈哈哈 。 因为日语叫 Mojibake， 就是文字 。

**吴涛** [24:41]
OK。

**Rio** [24:42]
Moji 是文字嘛 ， 然后 Bake 就是变化嘛 ， 就是文字变掉了 。

**吴涛** [24:47]
OK。

**Rio** [24:48]
嗯哼 。

**吴涛** [24:48]
德语里面叫 ， 呃 ，Zeichensalat， 就是符号沙拉 。

**Rio** [24:53]
哈 ？

**吴涛** [24:54]
对 ， 就好像沙 ， 沙拉一样被拌 ， 被拌在一起了 。

**Rio** [24:58]
哈哈哈 。 那英文叫什么呀 ？

**吴涛** [25:01]
Including error。

**Rio** [25:02]
从来没遇到过这种概念 。

**吴涛** [25:03]
编码错误啊 ， 应该就是这样 。

**Rio** [25:06]
不 ， 就是 ， 就是因为就感觉这个事情在英文里面其实挺难出现的 。 你想象一下 ，他们都是那个 ASCII， 对吧 ？

大部分都 ， 基本上所有的这个 ， 这个编码方式都 ， 都兼容他们 。

**吴涛** [25:17]
不 ， 那即便如此 ， 比如说他们看到一个 ， 呃 ， 比如说俄语的那个编码 ， 然后用什么 ， 呃 ， 用 ， 用 ISO8859 来显示的时候 ， 那同样是没有任何意义的文字啊 。

那他们对这个玩意 ， 对这个东西总有一个 ， 总有 ， 总得有个称呼吧 。

**Rio** [25:36]
反正在维基上面有一个这样相关的一个页面叫 Mojibake， 就是日文的那个音 。

**吴涛** [25:45]
OK。

**Rio** [25:46]
就是音译的日语是吗 ？

**吴涛** [25:48]
Oh, garbled，garbled text。OK， 好吧 。 德语就是 Zeichensalat 对应的 。 对 。

**Rio** [25:55]
对啊 ， 这个德文的 Zeichensalat 这个 page， 呃 ， 这个就翻译成乱码嘛 。 然后日语 ， 呃 ， 英文界面就是 Mojibake。

**吴涛** [26:02]
嗯 。 所以英文其实它是那个直译了 ， 对 ， 它直译了这个 。

**Rio** [26:07]
OK， 所以英语没有一个原生的 。

**吴涛** [26:09]
这个就像是 Emoji， 就是日文对这现代这个字符编码的一些贡献 。

**Rio** [26:18]
对 ， 这其实是一个比较本地化的一个说法 ， 就是这种事情可能只是在东亚地区最先出现 ， 然后日本又是一个最早在这个 CJK 领域确定了字符 ， 比较标准字符集的这样一个国家 ， 所以他们可能最早遇到这个问题 ，他们就创了一个术语这样 。

**吴涛** [26:37]
所以我们要从字符集和编码开始说 。

**Rio** [26:41]
Correct。

### 字符集

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

**Rio** [26:43]
那先讲中文吧 ， 嗯 ， 中文的 GB 编码是不能不说的 。

**吴涛** [26:47]
好吧 ，是不是应该先讲 ， 先讲汉字整个的这个 ？ 因为实际上那个 ， 呃 ， 东亚地区以 CJK 为核心的这个字符集的标准 ， 最早是日本人做的嘛 。

**Rio** [27:00]
就是 JIS 嘛 。

**吴涛** [27:01]
嗯 。 对 ， 日本 ， 日本在那个时代有比较强烈的支持日文的需求 ，因为日本是东亚第一个开始 ， 呃 ， 电子化的国家 ， 应该这么说 。

**Rio** [27:16]
对 ， 或者我觉得一部分原因也是因为他们最早能够在计算机上勉强地使用一些本地的文字 ， 比如他们将那个片假名用 ASCII 的扩展实现了 。

**吴涛** [27:29]
日本最早的一个这个文字编码呢 ， 应该是 JIS 的 0201。 啊 ， 它是个单字节的 ， 很关键 ， 它把这个七位的 ASCII 呢 ， 给它扩展上面放入了他们的半角的片假名。

而且呢 ，他们在这里面呢 ， 还和 ASCII 相比呢 ， 还有两个字不一样 ， 呃 ，他们在那个 92 那一号原来是反斜杠 ， 然后在这个 JIS 里面它给它换成了日元符号 ， 然后在 126 号里面原来是一个那个波浪 ， 啊 ，但是呢 ，在这个 JIS 里面给它换成了 ， 就是这个叫什么 ， 上划线 ， 这不是下划线 ，也不是中划线那个连字符 ，而是一个上划线 。

所以 ， 呃 ， 这个比较古老了 ，因为已经是 1969 年 6 月 1 号制定的 ， 这个可是日本最老最旧的一个文字系统 ， 啊 ， 就是文字编码 。

**Rio** [28:23]
所以这是第一次他们就是在这个计算机上面的实现了 ， 呃 ， 日文 。

**吴涛** [28:29]
嗯 ， 就为什么那个时候要选片假名不选平假名呢 ？

**Rio** [28:33]
哎 ， 就是传音嘛 ， 呃 ， 就是打电报嘛 ，因为这主要是为了通信的方便 。

**吴涛** [28:39]
OK。

**Rio** [28:41]
对 ， 就其实那个通常来说在技术领域是将日日本的这个书写系统对应到四种那个字符上了 ， 就是四种文字上了 ，也就是在 writing system 下面它用了四种的 script， 一种是所谓的罗马字 ，也就是拉丁文啊 ， 另一种就是片假名 ， 还有一种平假名 ， 最后才是汉字 。

**吴涛** [29:06]
呃 ， 我想是打个岔问个问题 ， 日本有没有想过 ，有没有过要把汉字整个废掉的思潮 ， 就是只用假名 ？

**Rio** [29:14]
有 。

**吴涛** [29:14]
应该有吧 ？

**Rio** [29:15]
有 。

**吴涛** [29:16]
对 ， 应该有 。

**Rio** [29:16]
嗯 。 然后因为朝鲜就是有这样的字 ，而且朝鲜的确是 ， 就是朝鲜半岛 。

**吴涛** [29:23]
朝鲜已经成功了吧 ？

**Rio** [29:24]
就朝鲜的话它已经几乎就都不用了 。 韩国的话呢 ， 就是偶尔还用 ，但是呢 ， 现在也是尽量都是用那个 。

**吴涛** [29:32]
谚文 。

**Rio** [29:32]
啊 ， 谚文 。 对 ， 中文叫 ， 呃 ， 中文习惯叫谚文 。 嗯 。

**吴涛** [29:36]
对 。

**Rio** [29:36]
但是他们 ，他们 ，但他们不喜欢谚文这个词 ，他们觉得谚文这个词是有 ，有歧视 ， 所以呢 ，他们更喜欢用 Hangul 这个词 。

**吴涛** [29:45]
嗯哼 。 啊 ， 所以 Hangul 和谚文其实还是两个词 。

**Rio** [29:49]
对 。

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

**Rio** [29:50]
因为谚文 ， 谚 ， 所谓的谚是谚语的谚嘛 ， 就是俗 ， 俗字的嘛 。

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

**Rio** [29:56]
嗯 ， 俗字的意思 。

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

**Rio** [29:57]
但是日本人倒是很乖的用假名嘛 ，因为假名的对应的是真名 ， 所谓的真名就是汉字 。

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

**Rio** [30:04]
日本人还乖乖的用假名。

**吴涛** [30:06]
假名不是谚的意思吗 ？ 在这里 。

**Rio** [30:07]
就是假谚嘛 。

**吴涛** [30:08]
对啊 。

**Rio** [30:08]
对啊 ， 所以假名的 ， 还有它的反义词是真名嘛 ， 所谓的真名就是汉字 。 所以后来 ， 呃 ，JIS 后面呢 ， 就是在用片假 ， 呃 ， 加入片 ， 嗯 ， 这什么 ， 半角片假名以后进行了 ， 从 78 年开始 ，他们后来 83 年、90 年、97 年改了好多次 ， 然后后面就逐渐的就是 ， 就相当于就是在区位码里面把所有的字都加进去了 。

**吴涛** [30:34]
够 ， 够用吗 ？ 就是那个码数够用吗 ？

**Rio** [30:37]
呃 ，也是不停不停的加呀 ， 所以每 ， 每改一次的话就是字数越来越多 。

**吴涛** [30:41]
因为你用那个 ASCII， 你把高位置上之后也就 128 个码点 。

**Rio** [30:46]
嗯 ，ASCII 只用来实现那个半角假名。

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

**Rio** [30:50]
嗯 。ASCII 的扩展就是 ASCII 扩展 ， 它当然有一个 JIS 的 Romance 的 ， 就是一个对 ASCII 的一个 ， 可以说是一个 ASCII 的一个 variation 吧 。

**吴涛** [31:00]
你在 ， 你说半角假名 ， 还有全角假名吗 ？

**Rio** [31:02]
啊 ， 对 。

**吴涛** [31:03]
一开始只有半角假名吗 ？

**Rio** [31:05]
这个概念其实有点 ，有点乱了 ， 我们是不是可以趁机来这个整理一下 。 就是所谓的这个半角假名 ， 它一方面指的是这个假名的宽度是那个全宽汉字的一半 ， 然后同时另一方面它也 ， 呃 ， 同义的指向了说这个字符只使用了一个字节 ， 这样子的一个意思 。

**吴涛** [31:24]
所以在上次节目我也说过 ， 就是所谓的单字节 、 双字节和半角 、 全角 ， 原来是两个概念嘛 ，但是呢 ， 就是说在字体排印里面是半 ， 所谓的半角全角 ， 它只是一个宽度的概念而已 。

**Rio** [31:38]
对 ， 对 ， 半角全角其实应该局限于描述视觉上的一个效果 。

**吴涛** [31:43]
对 ， 它是实际物理上面的一个宽度问题 。 然后呢 ， 单字节 、 双字节 ， 这就是 ，是编码的问题嘛 。

**Rio** [31:50]
嗯 。

**吴涛** [31:51]
而在 ，在很久以前 ， 的确半 ， 呃 ， 半角的就是单字节 ， 然后全角的就是双字节 ， 所以呢 ， 就开 ，有人开始混用了 。

**Rio** [32:02]
嗯 ， 对 ，而且这个混用其实是带有一定的主动性的 ， 就是说他们并不是错误的用了它 ，而是希望以这种方式帮助别人理解和记忆 。

**吴涛** [32:13]
记两个吗 ？

**Rio** [32:14]
到了现在混在一起了呀 。

**吴涛** [32:16]
哈哈哈 。 所以那个假名到底是 ， 就是说各数一共能 ， 能不能装到 128 个码点里面去 ？

**Rio** [32:24]
实际上呢 ， 就是在最早的时候呢 ， 呃 ， 它 ， 呃 ， 就是 JIS X 的 0208 的话 ， 它只装了 94 个字嘛 ， 就是就只装了那个半角片假名。

**吴涛** [32:34]
就 ， 就 ， 就 ， 就这样差不多用完了嘛 ，128 个点你用了九十几个 。

**Rio** [32:38]
嗯 ，94 个 。

**吴涛** [32:38]
那 ， 那全角的跟这个半角的有什么区别 ？

**Rio** [32:41]
全角是都用两个字符了嘛 ， 就用两个字节来表示了 。

**吴涛** [32:44]
不 ， 就是 ，但是它表达的 ， 它就说一个半角的假名和一个全角的假名 ， 它表示的是同一个东西嘛 。

**Rio** [32:49]
是同一个东西 。

**吴涛** [32:49]
所以现在就变成做两套了 。

**Rio** [32:53]
啊 ， 为什么要做两套 ？ 因为 ，因为那个半角假名显示的时候有一个 ， 就是一开 ， 一开始那个 JIS 的假名的 ， 呃 ， 片假名在显示的时候 ， 它的宽度和英文字母是一样的 。

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

**Rio** [33:06]
然后为了 ， 就是所以后来有了那个全宽度的汉字的时候 ， 那个你在全宽度的汉字里面夹杂着显示半宽度的片假名就很丑 ， 所以就做了一套全宽度的全角假名 ， 就是这么来的 。

**吴涛** [33:24]
所以我理解一下， 就是说 ， 呃 ，因为是为了对齐的需求 ，因为那个时候是都是那种 ， 就是 ， 就是 column display 嘛 ， 就是正 ， 正列的显示器嘛 ， 就为了满足那个跟英文对齐的需求 ， 所以我们强制就是牺牲了这个美观程度 ， 把那个假名压缩成半宽的 。

**Rio** [33:41]
是的 。 对 。

**吴涛** [33:42]
然后后来因为有 ，因为因为就变成那种图形 graphic 的 ， 就界面的时候 ， 就是为了好看 ，其实它应该是假名是应该和汉字等宽的嘛 。

**Rio** [33:51]
没有到 graphic 时代 ， 就是在那个显示器可以设置为双字节宽的时代就开始了 。 对 ， 就跟汉字一样嘛 。

**吴涛** [33:59]
这个需求就是因为是为了好看吧 ？

**Rio** [34:02]
为了好看 ，因为在如果你两个汉字中间夹着一个半宽度的假名就很丑嘛 ，而且制表啊什么乱七八糟的全都 ， 全都非常难 。

**吴涛** [34:11]
就还是为了对齐 ， 只是说以前是因为了半 ， 半宽是为了和英文字母对齐 。

**Rio** [34:15]
是为了和汉字对齐 。

**吴涛** [34:16]
是为了和汉字对齐 。 哇 ， 对 。

**Rio** [34:19]
但是呢 ， 就是比如说在日日本的 ， 比如说当年就 IMO 的手机时代 ， 日本的手机时代 ，因为片假名它是表英文字嘛 ， 所以片假名的外来语往往都写得很长 ， 所以它故意用半角片假名是为了省空间 ， 节约屏 。

**吴涛** [34:37]
啊 ，OK。

**Rio** [34:38]
就免得出现德语那种情况 。

**吴涛** [34:39]
屏幕空间有这么做的 。

**Rio** [34:41]
为什么要黑德语 ？

**吴涛** [34:42]
啊 ， 对 ， 德文的单字那么长 。

**Rio** [34:45]
因为德语你那个每个词都不写 ， 都那么长又没有空格 。

**吴涛** [34:48]
对 ， 就需要大量使用简写和缩写 。

**Rio** [34:52]
所以在 ，在从字体排印的传统上来讲 ， 德文是大量使用合字 ligature 和窄体字 condensed。

**吴涛** [35:00]
嗯 ， 对 ，是这样 。 尤其在高速公路路牌上 。

**Rio** [35:03]
哎 ， 半宽的假名看起来会不会很别扭啊 ，因为那么窄 ？

**吴涛** [35:07]
啊 ， 会 ， 会有一点啊 ， 确实会有一点 。

**Rio** [35:10]
反正我觉得很丑 。

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

**Rio** [35:12]
对 ， 它是一种妥协 。

**吴涛** [35:14]
嗯 。OK， 那所以于是下一个问题就来了哈 ， 就是说那半宽的假名对应的那个 ， 那个码点和全宽 ， 就是双字节的对应的码点 ， 它 ， 它 ， 它有这个 ， 就是是一样的吗 ？

或者这么问吧 ， 就是说如果现在现代的这个来处理的话 ， 它是两个字符对吧 ？

**Rio** [35:33]
是 ，是两个字符 。

**吴涛** [35:34]
显示不一样的 。

**Rio** [35:37]
OK， 那个在 Unicode 里面的那个 code point 它是一样的吗 ？

**吴涛** [35:41]
好像也不一样吧 。

**Rio** [35:42]
不一样 。

**吴涛** [35:43]
不一样 。

**Rio** [35:43]
Unicode 它为了向后兼容 ， 所以呢 ， 它也不一样 。 对 。

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

**Rio** [35:48]
那 ， 那如果说我们现在重新来设计这么一件事 ，其实它应该是用同一个 code point，但是在那个就是 render 渲染的时候 ， 应该选择不同的宽度以适应那个对齐就可以了 。

**吴涛** [35:59]
啊 ， 对 ， 从理想角度的话确实是可以这样做的 。

**Rio** [36:02]
是 ， 没错 。

**吴涛** [36:03]
对 。

**Rio** [36:03]
但对 ， 那个 。

**吴涛** [36:05]
但这是一个向后兼容的 。

**Rio** [36:06]
人类史就要重写了 。

**吴涛** [36:08]
对 。

**Rio** [36:09]
哈哈哈 。

**吴涛** [36:11]
对 ， 这其实是一个无法避免的问题了 ，因为就是这个编码的发展就是向后兼容有这个需求 ， 所以它一定会保留两套 。

**Rio** [36:18]
嗯哼 。

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

**Rio** [36:20]
对 ，以前是做了很多莫名其妙的事情 ， 然后后面来的新方案就不停不停的要为前面的擦屁股 。

**吴涛** [36:28]
擦屁股 。

**Rio** [36:28]
哈哈哈 。

**吴涛** [36:31]
好惨 。

**Rio** [36:31]
然后后面我们就终于有了双字节了 ， 对吧 ？

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

**Rio** [36:35]
有了双字节就有了区位 ， 就所谓的以前的区位码嘛 。

**吴涛** [36:39]
对 ， 日本好像叫区点是吧 ？

**Rio** [36:41]
对 ， 日本叫区点 。 那英文区就是 ， 呃 ， 区是 row 嘛 ， 就第几排嘛 ，row， 然后那个点就是刚才说的就是 cell。

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

**Rio** [36:50]
嗯 。

**吴涛** [36:51]
那就 。

**Rio** [36:52]
就是矩阵的行和列吧 。

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

**Rio** [36:55]
所以它 ， 它是真的是有一个表 ， 然后一行是多 ， 几行几列是什么字 ， 会有这么一个表出来 ， 对吧 ？

**吴涛** [37:02]
对的 。

**Rio** [37:02]
嗯 。

**吴涛** [37:03]
OK。

**Rio** [37:04]
然后后来咱们中国的 GB 的设计就是完全沿 ， 呃 ， 就是沿袭了这个 JIS 的整个设计系统 ，而且 。

**吴涛** [37:12]
所以双字节和那个区位码都是日本人发明的 ？

**Rio** [37:14]
最早是日本的 ，是 JIS。 对 。 而且呢 ， 咱们就和 ，也是学习日本的 ， 就是把汉字根据使用频率分成了两个等级 ， 常 ， 就是常用字和次常用字 。

嗯 ， 然后日本他们叫第一水准汉字和第二水准汉字嘛 ，在 。

**吴涛** [37:32]
怎么有种一流和二流的感觉 。

**Rio** [37:33]
啊 ， 就是 ， 呃 ， 根据那个频 ， 使用的频率 。 嗯 ， 那咱们到 GB 的 2312 也是嘛 ， 就是 ，而且咱们就是常用字的话是按照音序排列的 ， 那次常用字就是按照 。

**吴涛** [37:47]
笔画 。

**Rio** [37:47]
不少 。

**吴涛** [37:48]
是笔画 。

**Rio** [37:48]
不少 。

**吴涛** [37:49]
是按照步手 。

**Rio** [37:50]
步手 。

**吴涛** [37:51]
嗯 ， 按步手排列的 。 对 。

**Rio** [37:52]
就这个 ， 这个 ， 这个 ， 这个表哈 ， 就是有这个按两个音序和这个步手排列的这个表 ，是后来所有做这个 ， 就是的书法 ， 然后转换到汉字那个基础嘛 。

**吴涛** [38:04]
对啊 ， 内核恐慌就吴涛单独做了一期 ， 就是做了编码那一期嘛 。

**Rio** [38:08]
对 。

**吴涛** [38:08]
他开始 ， 一开始就说了一个问题 ， 一 ， 首先是个 encoding， 就是编码和解码的过程 ， 对吧 ？ 所以 GB， 比如说 GB2312， 它到底规定了什么东西 ？

它不仅是规定了那个字汇 ， 就是我要收这么多汉字 ，而且呢 ， 它还规定了就是要怎么来编这个码 。

**Rio** [38:25]
嗯哼 。 就说那个 ， 这个就是 GB2312 那个 ， 那个书里面应该是有一个很 ， 很长的一个列表 ， 把那个区 ， 每个区位的那个汉字都写那儿 ， 然后再规定一个方法去怎么去索引到那个汉字 。

**吴涛** [38:39]
因为 GB2312 它的正式名字叫信息交换用汉字编码字符集 。 首先它是要信息交换的 ， 然后呢 ， 它是给汉字进行编码的 ， 然后呢 ， 是一个字符 ， 然后有个字符 ， 字符集 ，character set 这样一个东西 。

**Rio** [38:57]
嗯 ，OK。

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

**Rio** [38:58]
OK。

**吴涛** [38:58]
它是 94 个区嘛 ，94 个区 ，94 个位嘛 ， 然后就有这么多这个码位 ， 然后把 6763 个汉字给它放进去 ， 当然了 ， 除了汉字以外， 还有那些什么图形符号啊什么这些的 。

**Rio** [39:14]
嗯 。

**吴涛** [39:15]
等一下， 你说 94 个区 ，94 个码 ，是说有这个 ， 这个矩阵 。

**Rio** [39:18]
94 乘 94。

**吴涛** [39:19]
94 乘以 94。

**Rio** [39:21]
对 。

**吴涛** [39:21]
一个格子 ， 对吧 ？

**Rio** [39:22]
这个跟 JIS 是一样的 。 嗯 。

**吴涛** [39:26]
那你那个刚才说常用和不常用从哪里体现出来呢 ？

**Rio** [39:30]
常用和不常用是两个集合嘛 ， 就是 ， 就是人是常用不常用是人为规定的两个集合 ， 然后他们以先后次序排 。

**吴涛** [39:37]
不 ， 就是如果在那个表格里面 ， 它 ， 它 ，因为你刚才讲有 ，有两种方式来排序嘛 ， 一种是按这个读音排 ， 一个是按字首排 。

**Rio** [39:44]
啊 ，其实不是这样 ， 就是有点混了 。 就是说首先将它们分成了常用和不常用两个区块吧 ， 你可以理解成 。

**吴涛** [39:51]
然后有 ， 对 。

**Rio** [39:53]
两个 ， 两类字 。

**吴涛** [39:54]
你先给 。

**Rio** [39:55]
首先把那个字 。

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

**Rio** [39:57]
对 ， 我们一般叫 class， 我们一般叫 class， 就一个 class 叫常用 ， 或者说叫一级汉字 ， 另一个 class 是不常用 ， 叫二级汉字 。

那么在一级汉字这个 class 内部 ， 它的排序是按音序的 ，而在二级汉字内部 ， 它的排序是按部首的 。

**吴涛** [40:14]
那跟这个 94 乘 94 这个格子有什么关系 ？

**Rio** [40:16]
呃 ，94 乘 94 只是它排布这个区位表的一种方式 。

**吴涛** [40:21]
对号入座 ， 就是 94 乘 94 是座位 ，而那些 ， 那些字呢 ， 就是把 ， 把它安到这个座位上去 。

**Rio** [40:31]
那所 ， 所以我可以这么理解吗 ？ 就是在这个 94 乘以 94 这个方格子里面 ， 前半部分是常用的汉字 ， 然后是按音序排的 ， 后半部分是不常用的汉字 ， 按部首排的 ， 这样吗 ？

**吴涛** [40:42]
呃 ，其实就是什么 ， 从第 16 到 55 区是一级汉字 ， 然后所有一级汉字放在这里面 ， 就是从第 16 区到第 55 区 。

**Rio** [40:50]
OK。

**吴涛** [40:51]
全 ， 就是相当于 ， 呃 ， 一级汉字按拼音次序排列 ， 一共 375，3755 个 。 然后从第 56 区开始一直到第 87 区是二级汉字 ， 然后排了 3000，3008 个嘛 ， 然后前面还有什么特殊符号之类的 。

**Rio** [41:07]
嗯哼 。

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

**Rio** [41:09]
啊 。

**吴涛** [41:09]
那那个阿字嘛 ， 就是音序里面的第一个字嘛 ， 它区位码是 1601， 就是它 16 区的第一个嘛 。

**Rio** [41:17]
所以大家如果去翻这个 GB 的话 ， 它就每个汉字 ， 它只是给每个汉字安排了一个座位 。

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

**Rio** [41:25]
嗯 ， 所以呢 ， 比如说阿字是 1601 嘛 。

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

**Rio** [41:29]
嗯 ，但问题是后面呢 ， 我们就好 ， 我们这个 1601 就是怎么编成码 ， 这是编 ， 这是另外一个编码的事情 。

**吴涛** [41:38]
对 ， 我们刚刚讲的都是一些字符集的事情 。

**Rio** [41:41]
对 ， 所以呢 ，不仅是有字 ， 然后还要有个编码的过程 。 我们先有 ， 我们先找到那么多字 ， 然后呢 ， 再给它安排这么多码位 ， 然后给 ， 给 ， 给它放上去以后呢 ， 还要进行编码 。

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

**Rio** [41:54]
哎 ， 等等 ， 我 ， 我打个岔问一下， 就所以区位码和那个 Unicode 的那个 code point 是可以对应起来的 ， 对吧 ？

**吴涛** [42:00]
可以对应 ，但是呢 ， 呃 ， 就是排列方式是完全不一样的 。

**Rio** [42:07]
就是说应该说 GB2312 它这份国家标准 ， 它同时涉及两部分 ， 一部分它涉及的是一个我们常称叫做 ， 呃 ， 编码字符集的这样一个字符集标准 ，而另一部分它也同时包含了一套这个编码的 encoding 的一套规则 。

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

**Rio** [42:27]
啊 ， 那 ， 那我重新描述一下， 应该是这么说 ， 就是说 ， 呃 ，GB2312 这个我们作为编码方式来讲的时候 ， 它是对应的是 UTF-8、UTF-16、UTF-32 这种东西 ， 然后 GB2312 这个标 ， 这个 ， 这个 ， 这个规范里面那个区位和区位码其实对应 Unicode 的那个 code point。

**吴涛** [42:46]
GB2312 就相当于一个只有一个编码方案 ， 只有 UTF-16 编码方案的 Unicode。

**Rio** [42:52]
对 ， 没错 。

**吴涛** [42:53]
没错 ， 没错 。

**Rio** [42:54]
嗯 。

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

**Rio** [42:55]
嗯 。

**吴涛** [42:55]
OK。

**Rio** [42:57]
啊 ， 所以你听不出来 。

**吴涛** [42:59]
啊 ， 现在来讲这个 GB2312 作为编码方式的时候 ， 它怎么玩的嘛 。

**Rio** [43:05]
作为编码方式来怎么玩 ，其实就是每个 ， 就其实跟 GB2312 一样嘛 ， 就是每个汉字和符号都需要两个字节 ，因为一个字节放不下， 然后， 呃 ， 第一个字节叫高位 ， 第二个字节叫低位 ， 然后， 呃 ， 高位 ， 高位有一个 ， 高位 ， 高位有一个对应的方法 ， 就是把一 ， 一共用了 87 个区嘛 ， 就是 96 个区没有用完 ， 然后从一区到 87 区那个二级汉字加上特殊符号就已经排完

了 ， 所以它就把那个 ， 呃 ， 字节 0x1，0xA0， 就是 ， 呃 ，16 进制的 A0 加上 1 到 87， 然后低位字节是 1 到 94 加上 0xA0， 所以如果你有一个 ， 呃 ， 所以 0xA0，0xA1，0xA1 就是相当于 ， 呃 ， 第一区的第一位 ， 就这么来的 。

然后高位字节 ， 呃 ， 就是相当于 0xB0 到 0xF7， 低位字节是 0xA1 到 0xF1， 然后一共有 6768 个码位 ， 然后有 ，有一些是空着的 。

对 。

**吴涛** [44:22]
所 ， 所以它这个高位字节和低位字节其实并没和那个区和位是没有什么关系 。

**Rio** [44:28]
没关系 。

**吴涛** [44:28]
对 ， 高位字节和低位字节完全对应于 ， 呃 ， 区号加上， 呃 ， 呃 ， 就 ， 就相当于 X 和 Y 嘛 。

**Rio** [44:39]
就是区位嘛 。

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

**Rio** [44:40]
嗯 。

**吴涛** [44:40]
相当于 X 和 Y。

**Rio** [44:41]
就说这两个 ，因为 ，因为那个表 ， 那个我们刚才讲那个区位码 ， 它是一个方格嘛 ， 就是 94 乘 94 嘛 ， 所以刚好如果我们用两个字节来表示 ， 就高位字节对应的是行 ， 然后低位字节对应的是列嘛 。

**吴涛** [44:54]
是这样 。 是这个意思 。

**Rio** [44:56]
是这个意思 ， 对吧 ？

**吴涛** [44:57]
就是实 ， 实际上是一个 87 到 94 的长方形区 。

**Rio** [45:00]
啊 ，有 ，有几个区是没有用的 ， 对吧 ？

**吴涛** [45:03]
对 ， 就 87 以后到 94 区就没有用了 。

**Rio** [45:06]
所以其实并不是一个方 ，94 乘 94 方的格子 ，而是 。

**吴涛** [45:09]
它没有填满 。

**Rio** [45:10]
有空 。

**吴涛** [45:11]
对 ， 它没有 。

**Rio** [45:12]
就有座位空着 ，但 ，但大致上可以认为高位字节表示行 ， 然后低位字节表示区位 。

**吴涛** [45:16]
对 ，是 。 所以 。

**Rio** [45:17]
然后中间有些特殊的那个空 ， 空格的地方 。 对 。 然后这个每个都要加上这个 16 进制的 A0，是 ， 就是可以转换为 ASCII 的那个 ， 就是第一位置为一的时候嘛 。

**吴涛** [45:28]
对 。

**Rio** [45:28]
就 128 起 。

**吴涛** [45:31]
OK, make sense。

**Rio** [45:32]
刚才说了 G， 呃 ，2312 它只有 6000 多个汉字 ，不够用嘛 ， 所以后来就又进行了扩展 ， 后面就有什么 GBK， 然后后面还有 GB18030 嘛 。

**吴涛** [45:45]
对 ， 我们小时候有很多同学的那个名字 ， 就是起一个冷僻的名字 ， 然后到时候去录什么准考证 ， 乱七八糟的就录不出来 。

**Rio** [45:52]
嗯 。

**吴涛** [45:52]
就是因为这个害的 。

**Rio** [45:54]
比如说 ， 啊 ， 什么两个吉祥的吉 ， 念 " 哲 " 嘛 。

**吴涛** [45:58]
啊哈 。

**Rio** [45:58]
嗯 。

**吴涛** [46:00]
陶哲的那个 。

**Rio** [46:00]
陶哲 ， 对 。

**吴涛** [46:01]
对 ， 这个字原来是作为哲学的哲的一体字 ， 废弃不用的 ， 所以呢 ，在当时的那个 GB2312 里面呢 ，是没有这个字的 。

**Rio** [46:12]
OK， 我 ， 我当时有个同学叫什么 ， 呃 ， 叫 ， 呃 ，他什么立威 ， 对 ，他中间有一个那个立字 ， 好像是木字旁 ， 右边有一个 ， 呃 ， 看起来像威海的威 ，但是下面是个乐 ， 就很冷僻的一个字 ， 每次录 ， 录准考证他就叫段 ， 空格威 。

**吴涛** [46:35]
哈哈哈 。

**Rio** [46:36]
好可怜 。

**吴涛** [46:36]
哎 ， 当时我记得就是为了解决这个用 GB2312 这个字符集不够用这种生僻字 ， 很多人， 啊 ，是用那个位图的方式是表示那些生僻字的嘛 ， 就直接画个图形 。

**Rio** [46:48]
还有人手写吧 ，不是 ？ 就是机器打不出来嘛 ， 所以后面手写不 ， 嗯 ， 另外 。

**吴涛** [46:53]
再补一个是吧 ？

**Rio** [46:53]
嗯 。

**吴涛** [46:55]
啊 ， 对 ， 这也是 ， 这也是个解法 ， 和那个用位图的方式差不多 。

**Rio** [46:59]
对 。

**吴涛** [46:59]
那有一个问题啊 ， 就 GBK 和 GB18030 也是用两个位的吗 ？ 就是双字节 。

**Rio** [47:07]
GB18030 本身两个字节够吗 ？ 三 ， 应该要用四字节 ， 应该是 。

**吴涛** [47:12]
它是变化的 ，是 ， 对 ，GB18030 它是四字节的 。

**Rio** [47:15]
那 GBK 呢 ？

**吴涛** [47:16]
如果按照刚才那个 GB2312 的编码方式 ， 那我们高位都不用都留出来 ， 就是 ， 就每 ， 你两个字节其实只有一共 14 个位可以用嘛 。14 的 ，2 的 14 次方应该是 16384 个字嘛 ， 然后 GBK 其实收录了 21880，886 个字节其实肯定是不够用的呀 。

**Rio** [47:35]
嗯 。

**吴涛** [47:35]
嗯哼 。

**Rio** [47:36]
所以怎么解决这个问题呢 ？

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

**Rio** [47:38]
啊 ， 所以刚才我那个算法不对 ， 它那个双字节它只算第一个字节的那个 ， 那个第一位是不能用的 ，其实是应该有 15 个位可以用 ，15 个位的话其实可以用到 32000 多个那个 ， 那个 ， 那个叫什么 ， 马甲 。

**吴涛** [47:54]
所以 GBK 是双字节的 ， 然后 GB18030 的话是双字节四字节混用的 。

**Rio** [48:00]
对 。

**吴涛** [48:01]
GBK 本身它不是一个正式的 GB。

**Rio** [48:04]
GBK 是微软搞的是不是 ？

**吴涛** [48:06]
对 。 嗯 ， 它就是内码是扩 ， 那 K 是扩展的扩嘛 。 嗯 ，但是它 ， 它本身 。

**Rio** [48:12]
啊 。

**吴涛** [48:12]
扩展的扩 ，但是就是汉字内码扩展规范嘛 ，但是它本身它没有号 ，其实因为它不是一个正式的 GB。

**Rio** [48:20]
对 ，GB 是国标的意思嘛 。

**吴涛** [48:22]
它不是一个正式的国标文件 。

**Rio** [48:24]
对 ，其实我们说 GBK 的时候 ， 大多数指的是它的那个字符集标准 ，而不是指它的编码方式 。 那么 GBK 这个字符集 ， 你完全可以用 Unicode 来给它编码 。

**吴涛** [48:36]
那 ， 那 ， 那 ， 那 GBK 和 GB2312 是什么关系 ？

**Rio** [48:39]
呃 ，GB2312 呢 ， 它首先定义了一个字符集 ， 就定义了一个字符集的标准 ， 同时呢 ， 它还给了一套编码方案 。

**吴涛** [48:48]
OK。

**Rio** [48:48]
但 ，但是同时 GB2312 的那个字符集 ， 我们也可以用 Unicode 来给它编码 。 也就是说 ， 一个字符集它是可以用很多种编码方式来实现它的 ， 同时一 ， 一种编码方式它也是可以去编很多个不同的字符集的 ， 就它们并不是一个完全一一对应的关系 。

对 ， 所以其实我们在讨论这些的时候 ， 只要时刻的区分清楚我们是在说一个字符集还是在说一个编码方式的话 ， 就不太会混淆 。

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

**Rio** [49:17]
嗯哼 。

**吴涛** [49:18]
好 ， 单从字符集的来讲的话 ， 所以呢 ， 就现在就是大家在买字体的时候 ， 就经常会说这个字体显示不出来嘛 。

那在做 ，在中国的字体厂商的话 ， 肯定它是首先是要做 GB2312 里面的它那个字 ， 呃 ， 一共是 6000 多个字嘛 ， 它是先做这个 ， 然后 。

**Rio** [49:39]
就那些是必须支持的 。

**吴涛** [49:40]
对 ， 一般来讲就是这是最低的门槛 。 嗯 ， 然后后面有支持 GBK 的的字库 ， 然后有支持 ， 呃 ，GB18030 的字库 。

说实话 ，GB18， 嗯 ， 支持 18030 的字库还非常少 ， 现在 。

**Rio** [49:55]
字实在是太多了嘛 。

**吴涛** [49:56]
对 ， 完整支持的非常少 。

**Rio** [49:58]
嗯 。

**吴涛** [49:58]
对 ， 反正是 6 万 ，6 万多 。

**Rio** [50:00]
因为那时候在做的时候把那个什么少数民族兄弟 ， 兄弟民族的一些文字也一起做进去了嘛 。

**吴涛** [50:08]
对 ， 一个不小心可能就超过了 OpenType 单个文件的 glyph 的限制了 。 对 ，因为一个 OpenType 它是用一个 unsigned short 的 ， 所以只有 6 万 ，也只有 6 万多个吧 ， 就应该是 655 多少 。

**Rio** [50:23]
65535。

**吴涛** [50:25]
对 ， 对 ， 对 ， 对 。

**Rio** [50:26]
6536。

**吴涛** [50:27]
对 ， 很有可能就放不下 。

**Rio** [50:28]
然后再从编码方式的说 ， 刚才我们也讨论了嘛 ， 那 GB2312 和 GBK 呢 ， 都是双字 ， 呃 ， 都是双字节的字符集的 。

那 GB18030 呢 ，是单字节 、 双字节 、 四字节 ， 就是它是变长的 。 嗯 ， 这个思想的话跟 Unicode 就是一样的嘛 。

**吴涛** [50:47]
哎 ， 我 ， 我有个问题啊 ， 就是 GB18030 那个码点和 Unicode 的码点是重合的吗 ？

**Rio** [50:53]
不一样 。

**吴涛** [50:54]
也不一样 ， 就后来是那个 ， 就是那后面要讲那个 CJKUnification 的关系 。

**Rio** [50:58]
对 ， 所以就是同样一个字的话 ，在 GB 里面它是这个座 ， 呃 ， 它是这个座位要用这个编码 ，但是呢 ，在 ，在 Unicode 的话它是另外一个座位要另外一个编码 。

**吴涛** [51:08]
那 ， 那 GB2312，GBK 和 GB18030 它们是一个超级的关系吗 ？ 还是也不一样 ？

**Rio** [51:14]
基本上是互相兼容的 。 啊 ， 就是相互兼容的 。

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

**Rio** [51:17]
相互兼容的 。

**吴涛** [51:18]
就是 GB2， 就 GBK 里面包含 GB2312 那些字并且是 。

**Rio** [51:23]
全部的字 。

**吴涛** [51:24]
在那个对应的位置上， 然后 GB18030 是包含 GBK 全部的字并且也是在那个位置上 。

**Rio** [51:31]
对 。

**吴涛** [51:31]
对 ，是这样 。

**Rio** [51:32]
对 ， 对 。

**吴涛** [51:33]
那就是 ， 就是一个超级 ， 一个比一个大的概念了 。

**Rio** [51:35]
对 。

**吴涛** [51:36]
对 ， 对 ， 对 。在这个 GB 的这一系列字符集里面 ， 最坑的只有 GB2345 这个标准 。 那么其他的都是一个就是越向后越往前兼容 ， 就是说后来的肯定是兼容前来的这样的 。

**Rio** [51:51]
所以我们在这里有机会一定要说一下 GB12345。

**吴涛** [51:55]
这个是什么 ？

**Rio** [51:57]
哈哈 ， 一个特别坑 。

**吴涛** [51:59]
GB12345 我从来没有听过这个东西 。

**Rio** [52:01]
对 。

**吴涛** [52:02]
哈哈 ，GB12345 是那个字体圈的一个噩梦 。

**Rio** [52:08]
都搜不到这个东西 。

**吴涛** [52:09]
啊 ， 就经常说的就是那个什么 ， 呃 ， 繁体字字符集嘛 。 它其实呢 ， 编码的就是跟那个 ， 呃 ，2312 是一样的 。

**Rio** [52:18]
哦 ， 可以看成一 ， 啊 ，GB2312 的繁体版本 ， 共收录 6866 个汉字 。

**吴涛** [52:24]
对 ，但多了几个 。

**Rio** [52:26]
因为大家知道就是繁简不是一一对应的 。

**吴涛** [52:30]
没错 。

**Rio** [52:30]
那在汉字在简化的时候 ， 一般是多繁对 ， 把好多个繁体字同时简化成一个简体字 。 所以原来它就是在 GB2312 是定的是简体字嘛 ， 那它改成 12345 的时候 ， 它字 ， 它要写繁体字它就要变多嘛 。

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

**Rio** [52:49]
但是这个一繁 ， 呃 ， 多繁对一简的时候怎么办呢 ？ 它就会挑选一个就是简体字 ， 呃 ， 对应的繁体字先安上去 ， 然后剩下的那些剩下来的繁体字它统一放到最后， 码位上的统一放在最后 。

**吴涛** [53:04]
就是之前那个说的那些空位的那些地方 。

**Rio** [53:07]
对 。

**吴涛** [53:08]
哎 ， 简繁转化这里可能要提一下啊 ， 刚才说多繁对一简 ，其实也有一简对多繁 ， 就是多 ， 哎 ， 说错了 ， 就是 。

**Rio** [53:16]
一繁对多简是吧 ？ 你怎么说 ？

**吴涛** [53:18]
呃 ， 一简对多繁是非常常见的 ，但是 ， 呃 ， 一繁对多简的话 ， 它其实往往是一个一体字之间的 。

**Rio** [53:26]
对 ，也有 ，但是的确也有 。

**吴涛** [53:28]
相互的关系 。

**Rio** [53:28]
对 ，也有 。 它 ， 它不是一个 。

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

**Rio** [53:30]
对 ， 这个 ， 这个 ， 哎 ， 数学上怎么描述这种函数的概念来着 ， 我一下忘了 ， 这不是函数 。

**吴涛** [53:35]
单射 ，不是一个单射 。

**Rio** [53:37]
对 ，不是单射的一个概念 。

**吴涛** [53:40]
一繁对多简 ， 比如说钱坤的钱 。

**Rio** [53:43]
对 ，有 。

**吴涛** [53:44]
对 ，在繁体字里的话 ， 它可能是干 ，也可能是钱 ， 它是一个多音字 。

**Rio** [53:49]
嗯哼 。 但是对到简体的就跟因为它用途不同 ， 就把它分化成两种不同的写法了嘛 。

**吴涛** [53:55]
对 ， 它把干的这个时候呢 ， 对应到另外一个字上去了嘛 。 所以呢 ， 这个多音字就变成了一个单音字 ， 专指钱坤的钱 。

**Rio** [54:03]
所以 ，其实很多那个 ， 很多那个朋友写的那种 ， 就是网页在线的什么简繁转化工具都是不合格的 。

**吴涛** [54:10]
呃 ， 对 ， 如果你的算法很简单的话 ， 确实会出错 。

**Rio** [54:14]
就它很多 ， 很多人都是直接拿一个那个 ， 就是那个 map， 那个 dictionary 的表 ， 就是一 ， 一 ， 这个换成那个就完了嘛 ，但其实是要根据语境和那个前后文来 ， 来决定的 。

**吴涛** [54:25]
对吧 ， 钱坤换成干坤的还蛮多的 。

**Rio** [54:29]
哈哈哈 。

**吴涛** [54:30]
然后说到这个 GB12345 的字体产品的话 ， 我们也必须要说一下， 对吧 ？ 因为内码是一样的嘛 。 所以在国内的一些大的字体厂商 ，他们曾经就是有 ， 呃 ， 到现在也有 ，他们所谓的繁体汉字的字库 ， 就以换字库的形式来实现繁体 ，而不是没有换内码 。

**Rio** [54:51]
就是因为那个 GB2345 的问题嘛 。

**吴涛** [54:53]
对 ， 所以呢 ， 就是因为他们用 12345 来 ， 来做编码嘛 。

**Rio** [54:57]
对 ， 对 ， 对 。

**吴涛** [54:58]
那个它只是在表面 ，因为到了用字库显示 ， 它其实是最后显示的层 ， 层级了嘛 。 它码其实没变嘛 。

**Rio** [55:07]
对 。

**吴涛** [55:07]
嗯 ， 这样的话 ， 这样做出来的 GB12345 的繁体字库就不能解决一简对多繁的问题 ， 然后就经常出错字 。

比如说永 ， 呃 ， 呃 ， 什么永和九年岁在葵痘嘛 ， 那个痘子就变成了没痘的痘了 。 所以呢 ， 我曾经在我的微博上讲过这个 ， 如果一个产品哈 ， 它一个字库产品如果会导致错 ， 错字的话 ， 我觉得这是 ， 这应该讲是一个不及格的产品 。

**Rio** [55:38]
但是它的自我设计方式上， 它没有别的解决方案了呀 。

**吴涛** [55:41]
对 ， 所以就是说禁 ， 就是应该废除用 GB12345 来分装字库 。

**Rio** [55:47]
就那个 ， 那个本来就是一个 hack。

**吴涛** [55:49]
哈哈 ， 对 ， 那是一个固定时期的产物 ，而且是一个不成熟的产物 。

**Rio** [55:55]
就过渡方案呗 。 现在其实都 ， 就刚才我们说嘛 ， 你看我们都没有听过 GB12345 这个规范 ，其实应该用的也不多了吧 。

**吴涛** [56:02]
哈哈 ， 对 ， 就因为国内有几个大厂 。

**Rio** [56:06]
嗯 ， 就是大家现在去买繁体字 ， 字库的话 ，有很多就是这样的 。 所以呢 ， 又 ， 另外一个问题就是说繁简转化应该怎么转化啊 ？

就不能单纯的就是像用这个 GB12345 的字库到最后只转字库而没有转码啊 。 我们应该彻头彻尾的把码换掉 。

嗯 。

**吴涛** [56:25]
就不能用那种 dirty 的 hack。

**Rio** [56:29]
可是就是因为有大厂 ， 中国的很多大厂的话都做了 GB12345 的字库 ， 所以导致现在街头巷尾很多错字都是这样 。

**吴涛** [56:38]
头都去砍了 。

**Rio** [56:39]
哈哈哈 。

**吴涛** [56:41]
这是名副其实的文字狱啊 。

### Unicode

**Rio** [56:43]
哈哈哈 。

**吴涛** [56:47]
好吧 ， 那我们终于可以说 Unicode 的问题了 。

**Rio** [56:52]
Windows 的那个要不要先讲一下 ？

**吴涛** [56:54]
就为什么世界上会先有 GBK， 就是因为 ， 呃 ， 操作系统的发展已经远远超过了国家制定标准的发展 ， 然后操作系统厂商微软不得不先解决了一个人们必须要解决的痛点 ， 然后国家才跟上的推出了 GBK， 呃 ，GB2， 呃 ， 那个什么 。

**Rio** [57:15]
18030。

**吴涛** [57:16]
来取代 GBK 的 。 我觉得从这个侧面其实反映出了现在处 ， 我们已经处在一个接近于那种就是跨国的 ， 就 ， 或者怎么说呢 ，在 ， 就从这件事上开始 ， 就是跨国的公司取代政府来解决你的一些民生问题的一个时代 ，其实就是从这里 ， 从这种事情开始 。

**Rio** [57:39]
如果你要说的话 ， 一肯定就是政治 ， 呃 ， 政治肯定是落后的 ， 永远都是经济先行的嘛 。 所以我们现在 。

**吴涛** [57:47]
我的意思是 ， 我的意思是在 ，在微 ，在呃 ， 信息时代之前 ， 很少会有一个公司会 ， 呃 ，在这种跨国的 ， 呃 ， 超越政府界限的这个 ， 这个程度上来改变我们的生活 。

**Rio** [58:04]
大国吧 ， 小国其实这种事情经常发生啊 。

**吴涛** [58:06]
就以前可能是有 ，但以前 ，以前比如 IBM 之类的 ，他们做的事情可能更多的也就是做制定一个国内标准 ， 就国内工业界的标准 。

但是在微软这件事情上， 你由一个外国厂商来搞一个你国文字 ， 这好像还是前 ， 就是前所未有的事情 ， 我觉得 。

**Rio** [58:25]
不 ， 就是对于小国来说 ， 这种事情应该经常发生啊 。 就是比如说周边那些可能人口也很少 ， 占地面积很小的国家 ， 它真的什么技术都是要由别人提供给它的 ， 别人先用了 ， 它才说哦 ， 我们来可以 ， 呃 ， 就这样支持它喽 。

就 ， 就继承标准嘛 。

**吴涛** [58:43]
对 ，其实类似的例子在这个 CJK 领域并不罕见啊 。 比如说那个字符集标准 ， 像香港的那个字符集标准 ，其实主要就是由华康和蒙娜两家字体公司来推动的 。

那么香港显然就是属于一个政府在这方面管制力不强的这样一个地区 。

**Rio** [59:03]
对 。

**吴涛** [59:03]
就曾经了 。 对 ， 那么包括像新加坡也是 ， 新加坡早期是直接照搬了 GB2312 来作为他们这个文字标准的 。

那么后期 Unicode 出来之后， 呃 ，他们又收录了一部分这个号称来源是新加坡的一部分汉字 ，但是实际上 。

**Rio** [59:22]
这就是为什么维基百科里面有个马新简体 。

**吴涛** [59:25]
对 ，但实际上呢 ， 那个至今好像没有明确的来源说这个新加坡来源的汉字是他们政府官方给的 。

**Rio** [59:33]
哎 ，不对 ， 的确是有的 ， 的确是有的 ， 就是在新加坡当时它有新加坡的一些简化字 ， 就和大陆简体不一样的 ，有几十个字 ， 数量不多 。

嗯 。

**吴涛** [59:44]
OK， 这里可能要插一下历史啊 ， 就中国大陆搞简化字的时候 ， 新加坡也跟着搞了是吧 ？ 当时他们做这个简化的背景和目的是什么 ？

**Rio** [59:53]
呃 ， 应该还是为了提高识字率吧 ， 这个出发点都是类似 。

**吴涛** [59:59]
就是要 。

**Rio** [59:59]
都是一样的 。

**吴涛** [1:00:00]
我 ， 我倒觉得是为了贴合当时， 就中华人中有一个 ， 怎么说呢 ， 就站起来的国家嘛 。 不是吗 ？ 就新加坡你不是也搞了一个

，不是民族认同感 ，而是因为新加坡本来就是一个华人建立的国家 ， 然后他们看到这个就是母国非常强盛 ， 就 ， 就心向往之嘛 ， 或者说出 ，是出一种就是现在也有这种强势文化出现了 ， 然后这个 ， 呃 ，不是强势文化 ，而是一个就是有一个独立自主的国家出现了 ， 那就采取 ， 采用了这样一种 ， 就出 ， 我觉得是出一种民族认同感来做的 。

不像那个 ，不就是现 ，因为现在大家都很讨厌中国 ，但那个时候中国刚出现的时候还是比较让全球华人为之一震的嘛 。

**Rio** [1:00:46]
对 ，有可能有一部分这个因素 ，但是 ， 呃 ， 我 ， 我的观点是认为还是因为新加坡其实在那个时期并没有这方面的专家来具体的制定一个新的标准的能力 ， 所以他们情愿去搬一个在文化上面和在这个身份认同上都跟他们接近的国家的一个成熟标准 。

**吴涛** [1:01:06]
不 ， 问题是你 ， 你 ， 你这个回避了一点 ， 就是他们还有一个选择 ， 就是什么也不做啊 ， 继续用 ， 继续用繁体啊 。

为什么一定要 。

**Rio** [1:01:12]
你是说为什么要做简化是吗 ？

**吴涛** [1:01:15]
对啊 。

**Rio** [1:01:15]
OK。

**吴涛** [1:01:17]
是这样子 ， 新加坡使用的汉字 ，他们在 1969 年他们颁布了新加坡的简体字表 ， 呃 ， 然后这个简体字有 502 个字 ， 所以他们一般把这个称为 502 简体字表 。

然后这 ， 这个简体字表和中华人民共和国的汉字简 ， 呃 ， 简 ， 简化方案是不一样的 。 然后里面呢 ，有 67 个字呢是不一样的 。

**Rio** [1:01:40]
嗯 。

**吴涛** [1:01:42]
OK。

**Rio** [1:01:42]
那怎么处理 ？

**吴涛** [1:01:43]
然 ， 然后 1976 年的时候呢 ， 新加坡又 ， 又说他们倒过来 ， 呃 ， 完全采用 ， 呃 ， 中华人民共和国的简体字 。

**Rio** [1:01:52]
就把那 67 个也干掉了 。

**吴涛** [1:01:54]
对 ， 所以呢 ， 这 67 个字呢就是曾经出现过 ，但是呢 ， 现在已经不用的字 。

**Rio** [1:02:02]
嗯 ，但是 Unicode 这种垃圾堆应该也装进去了吧 ？

**吴涛** [1:02:05]
对 ， 对 ， 对 ， 所以要装进去 。

**Rio** [1:02:06]
有一些是装进去了没错 。

**吴涛** [1:02:08]
对 ， 全部装进去了应该是 。

**Rio** [1:02:10]
我就 ， 你刚才 Rio 问说那个时候怎么处理 ，因为那 1969 年的时候 ， 那个时候你注意不一样的签字就可以了嘛 ， 那个时候没有电子化的问题 。

**吴涛** [1:02:18]
对啊 ， 这个意思 。

**Rio** [1:02:20]
对 。

**吴涛** [1:02:21]
嗯 。

**Rio** [1:02:21]
就不存在码点这个问题嘛 。

**吴涛** [1:02:23]
对啊 。

**Rio** [1:02:23]
对 ， 所以我觉得他们用回 GB2312 也是因为他们处理不了新的问题啊 ， 就是他们没这个能力来做这方面新的技术规格 。

**吴涛** [1:02:33]
这不划算嘛 ， 你本来人口少的国家你要做这种吃力不讨好的事情 ， 何必呢 ？

**Rio** [1:02:38]
嗯 。

**吴涛** [1:02:39]
就像直接那个叫什么 ， 哎 ， 我们现在话 ， 行话说叫直接来 fork and reuse 嘛 。

**Rio** [1:02:46]
对 ， 这个历史 ， 包括在这个 Big5，Big5 也是开始照搬了 JS 的规范 ， 然后自己做了一些扩展 。

**吴涛** [1:02:55]
OK。

**Rio** [1:02:57]
所以 ， 所以现在有 ，有个历史遗留问题哈 ， 就是说当 ， 比如说当时说微软搞了那个 GBK， 然后后来国家补了一个这个 GB18030， 那么实际上在这个微软的操作系统里面到底是用编码的时候是用 GBK 还是 GB18030？

**吴涛** [1:03:16]
Windows 的内核应该是用 Unicode 对吧 ？

**Rio** [1:03:19]
对 ， 对 ， 那 ， 那个都一样嘛 ， 就是它内核表示它支持多国语言 ， 肯定是要用统一的标准嘛 。 但是在默认 ， 比如说你一个中文版的这个 Windows， 你用这个记事本默认保存的时候 ， 它选择的编码方式是什么 ？

**吴涛** [1:03:31]
我 ， 我是这么理解的 ，Windows 里面有一个默认的那个码本 ， 就是有一个 Code page， 你得去选 ， 然后你选什么 ， 它默认的储存就是什么 。

**Rio** [1:03:40]
对 ， 对 ， 对 。

**吴涛** [1:03:41]
如果你是中文版 Windows 的话 ， 那默认就是 GB1， 呃 ，18030 应该是 。

**Rio** [1:03:47]
对 ， 对 ， 对 ， 我就这个意思 ， 就是说它等于是给这个某一个区域版本的 Windows 选择了一个默认的保存的这个编码方式嘛 。

**吴涛** [1:03:56]
和打开 ， 对 ， 的编码方式 。

**Rio** [1:03:57]
对 ， 它打开和那个 Decode。

**吴涛** [1:03:58]
就好像有些人玩日文游戏一定要先把那个 Code page 改成日文的 ， 然后再玩的时候日文的游戏才不会显示乱码 ，但是其他系统的所有部分都是乱码了 。

**Rio** [1:04:07]
没错 ， 所以那个现在就 Windows 用的那个 Code page 到底默认是 GBK 还是 GB18030 的 ？

**吴涛** [1:04:12]
我记得是 18030， 如果我上一次改的时候应该还是 18030。

**Rio** [1:04:16]
现在已经变成 18030 了 ， 现在已经改了 。

**吴涛** [1:04:18]
对 ，因为那个时候没有 GBK 的时候你自然就是 ， 就没有 18030 的时候自然就是 GBK 了 ，但现在有了 。

**Rio** [1:04:25]
那 ， 那所以就可以牵涉到 Windows 不同版本它有不同行为的这个结 ， 结果了吧 ？

**吴涛** [1:04:29]
是没错 。

**Rio** [1:04:31]
那 ，但 ，但然后因为刚才我们讲的那个 GB2312，GBK 和 GB18030 它是一个逐渐就超级的一个关系 ， 所以新版本的 Windows 它总是能兼容旧版本的那个文件的嘛 。

**吴涛** [1:04:48]
理论上是这样 ， 这个 ， 这个其实需要找一个 Windows 对 Windows 编程比较熟悉的人来解释 。

**Rio** [1:04:54]
他们的编码方式是向后兼容的 。

**吴涛** [1:04:57]
对 。

**Rio** [1:04:57]
OK， 所以就不存在说 Windows， 比如说 Windows 10 默认是 GB18030 中文版哈 ， 哎 ，不对 ， 它应该用 Unicode 吧 。 哎 ，anyway， 假设它是用 GB18030， 它存回去就还可以 ，也可以打得开之前 Windows， 比如说 XP 用 GBK 编码的时候存的东西 。

**吴涛** [1:05:14]
对 ， 这是肯定可以的 。

**Rio** [1:05:15]
OK。

**吴涛** [1:05:16]
嗯 。

**Rio** [1:05:17]
所以就是说那个代码页 ， 这 Code page 这个事情的话 ， 就只有 Windows 在用吧 ？

**吴涛** [1:05:22]
啊 ，IBM 的那套架构 。

**Rio** [1:05:25]
嗯 。

**吴涛** [1:05:26]
啊 ， 对 。

**Rio** [1:05:27]
因为在其他的 ， 像比如说 Mac 和 Linux 上面 ， 它是你让你直接在 ， 就是叫什么 ， 就是保存的时候文件编辑器 。

**吴涛** [1:05:35]
它是用那个 chassis 的一个标志吧 ， 应该 。

**Rio** [1:05:38]
对 ， 没错 。

**吴涛** [1:05:39]
这是两种 ， 两种编码的标记的哲学吧 ， 可以说是 。

**Rio** [1:05:44]
哈哈哈 ， 一个是全系统的嘛 ， 一个是那个 per file 的 。

**吴涛** [1:05:48]
嗯 。

**Rio** [1:05:49]
呼 ， 终于讲清楚这个 Windows 和 GB 的那些东西了 ， 现在开始 。

**吴涛** [1:05:54]
我不知道我们听众有没有被我们绕晕 。 我觉得其实对于很多听众来说可能并没有 。

**Rio** [1:06:01]
他们可能已经被我们绕晕了 。

**吴涛** [1:06:03]
有 ，有 ，有一种 ， 哎 ， 吴涛那个什么 ， 那个什么沙拉怎么说来着 ？

**Rio** [1:06:08]
菜心沙拉 。

**吴涛** [1:06:09]
对 ， 对 ， 脑子里全是那个 。

**Rio** [1:06:11]
听着一脑的沙拉 。

**吴涛** [1:06:14]
以后说 ， 对 ，以后说你一脑浆糊 ， 说你脑 ， 你一脑菜心沙拉 。

**Rio** [1:06:20]
哈哈哈 ， 这个比较好 ， 听起来很高级 ， 菜 ， 菜心沙拉 。

**吴涛** [1:06:23]
哈哈哈 。

**Rio** [1:06:27]
OK， 呃 ， 现在终于进入到了 Unicode 的时代 ， 实际上是并 ， 并存了吧 ，在时间观念上是有 ，有重叠的 。

**吴涛** [1:06:35]
嗯 ， 应该说 Unicode 它作为一个独立的这样一个机构 ， 它希望能推动全球文字编码和字符集的这两套标准都统一的这样一个 ， 一个目标吧 ， 应该说 。

但是同时它又不能去废除那些地方性的编码方案 。

**Rio** [1:06:54]
对 ， 就只能想办法去都兼容呗 。

**吴涛** [1:06:57]
所以这样造成一个结果的话 ， 它就是不可能向后兼容了 。

**Rio** [1:07:01]
就必须要改 ， 改 mapping 了嘛 。

**吴涛** [1:07:04]
对 ， 对 ， 对 ， 除了以及 ， 呃 ， 最新的那个 ASCII 的码位它是保留的 。

**Rio** [1:07:08]
就是这个什么 ， 美国人发明的吗 ？

**吴涛** [1:07:10]
美国中心主义 。

**Rio** [1:07:11]
啊 ， 应该说 Unicode 它用 ， 它定义字符集的时候呢 ， 它创造了一个它称为叫什么 ，Unicode 什么 scalar，scalar 那个叫什么 ？

**吴涛** [1:07:22]
标量 。

**Rio** [1:07:22]
Scalar value 是吧 ？ 就是它所谓的它这个 Unicode 标量值的这样一个非常规范的标记方式 。 那么这个值的 ， 这个数值显然跟 ASCII 和我们传统见到的一些编码的数值 ， 就我们所谓的这个内码数值都是不一样的 。

它是一套完全独立的方案 ，但同时那个 Unicode 创造了这个三个主流的编码方案 ，Unicode 那个 UTF-8，16 和 32 里面 ，16 应该是兼容 ASCII 的 ，但是 ， 呃 ， 啊不对 ，8 是兼容 ASCII 的 ，但是那个 16 和 32 就是完全独立的 。

**吴涛** [1:07:57]
因为字节宽度不一样嘛 。

**Rio** [1:07:59]
啊 ， 对 ， 对 ， 对 ， 就是 32 是一个固定宽度的一个编码方案 。 那么它的这个 ， 它是一个比较漂亮的编码方案嘛 。

它的这个编码的数值跟那个 Unicode 的那个 scalar value 是一对应的 。

**吴涛** [1:08:14]
因为它最宽嘛 ，有四个字节了 。

**Rio** [1:08:16]
对 ， 它是可以完全写出来这个 。 那么这个 16 的话就是由那个双字节和四字节切换的这样一个模式 。8 的话就是一个在单字节模式下是兼容 ASCII 的 。

**吴涛** [1:08:29]
你虽然那个四个是很漂亮的嘛 ，但是固定四个的话就很浪费 。 如果你存储 ， 比如说西文的话 ， 就非常浪费 。

**Rio** [1:08:38]
嗯哼 。

**吴涛** [1:08:39]
所以后来大家就觉得还比较经济的方式还是用变长的方式比较好 。

**Rio** [1:08:45]
嗯 ， 对 。

**吴涛** [1:08:46]
对 ， 这样的就 。

**Rio** [1:08:47]
而且还 ， 还有一个问题是 ， 就是那个定长的有解决不了的 ， 待会会提到哈 。

**吴涛** [1:08:53]
啊 ， 所以刚才说的区位嘛 ， 呃 ， 区有 row， 然后位是 cell， 然后后面就开始有个平面了 ， 就叫 plane。 嗯 ， 然后好几个平面呢又变成一个 group， 变成一个组 。

这是整 。

**Rio** [1:09:10]
就这个是 Unicode 码位的一个划分 。

**吴涛** [1:09:13]
对 ， 这是整个 Unicode 它的一个 ， 它必须要有这么多个座位才能把所有全世界这些字给安排下去 。

**Rio** [1:09:21]
嗯哼 。

**吴涛** [1:09:22]
嗯 ， 然后就会有我们常说的一个词 ， 就是什么基本多语言平面吧 ， 就是 BMP，Basic Multilingual Plane， 就是所谓的地理面嘛 。

**Rio** [1:09:34]
这个地理面应该说就是是一个双字节的 ， 就 16 个 ，16 个 bit 的这样子的一个字符集的组合嘛 。 这是因为早期 Unicode 它没有想到会进来那么多的字符 。

**吴涛** [1:09:47]
越加越多 。

**Rio** [1:09:48]
它就只定义了这样一个平面 。 对 ， 这个平面就是成为了一个最基本的叫地理平面 ， 或者叫 BMP 这样子 。

**吴涛** [1:09:57]
叫什么来着 ？65,536 个码位已经够用了 。

**Rio** [1:10:01]
哈哈哈 ， 对 。

**吴涛** [1:10:03]
啊 ， 事实证明是不够的 。

**Rio** [1:10:05]
嗯 。

**吴涛** [1:10:06]
然后， 所以这里其实我们还是要把那个刚才那个东西再 ， 再稍微形象解释一下， 就说我们刚才讲哈 ， 那个 GB2312 它规定了一个方格嘛 ，94 乘以 94 这么一个区间 ， 然后有些空哈 ， 没用 ，但是它是一个 ，也是一个矩阵嘛 。

然后 Unicode 其实这个我们讲的这个 BMP 这个基本面其实大致上可以对应为那个 ，不过它是一个 25，256 乘以 256 的一个 。

**Rio** [1:10:30]
啊 ， 对 ， 那就是乘出来就是 65,536，65,536 个座位 ， 啊 ， 就是这个码位 。

**吴涛** [1:10:37]
嗯 ， 对 ，但其实这只是为了好看 ， 它本质上还是一长串 ， 就是一个竖 ， 就是它如果我们应该想象它一个竖轴上， 它应该是一个一维的一个东西 。

**Rio** [1:10:48]
对 ， 然后再往里面添上就各国的文字 ， 对吧 ？ 这是刚才我们说的这个码位的事情 。

**吴涛** [1:10:57]
嗯 。

**Rio** [1:10:58]
然后这个基本平面里面有些什么字是什么规定的 ？ 就有 ，有什么讲究吗 ？

**吴涛** [1:11:04]
就是按顺序往里填呗 。 哎 ， 这个 ， 这个区 ， 区 ， 区位就非常多了 。

**Rio** [1:11:08]
OK， 那 ， 那比如说我问一个问题啊 ， 就是说 ， 呃 ， 中文字是放 ， 就大部分中文字是放在那个基本平面里面的吧 ？

**吴涛** [1:11:17]
对 。

**Rio** [1:11:18]
啊 ， 常用的 。

**吴涛** [1:11:19]
OK。

**Rio** [1:11:20]
一直汉字基本都在里面 。

**吴涛** [1:11:22]
那比如说对应刚 ， 刚才我们说的那些东西 ， 就是说不是 GB2312 里面所有的字符都在基本平面里面吧 ？

**Rio** [1:11:29]
嗯 。

**吴涛** [1:11:31]
它有在扩展面的 ， 就是在后面其他的面上的 ， 的确是有的 。

**Rio** [1:11:36]
OK。

**吴涛** [1:11:37]
OK。

**Rio** [1:11:37]
明白 。 那 ， 那再问一个问题啊 ， 就是说在这个 Unicode 的基本面里面的那个码位的那个中文那一 ， 就是 ， 就基本汉字 。

**吴涛** [1:11:47]
Unicode 里面已经有一个新的称呼 ， 就是 CJK 统一表意文字了 。 就不仅是中文了 ， 就是中日韩 ， 就大家啊 ， 全球大一统 。

**Rio** [1:11:57]
所有字形一样的文字全都可以塞在里面 。

**吴涛** [1:12:00]
OK， 这里 ， 这里就说要解释一下为什么会有这么一个事 ， 就是它的逻辑是什么 ？

**Rio** [1:12:06]
就是啊 ， 它的逻辑就是 Unicode 是针对这个 script 这种东西来划分它的 block 的 。 我们刚刚说了 ， 就是说这个日语 ， 日语或者说日文 ， 它作为一个书写系统 ，其实它用到了四种文字 ， 就是包括拉丁 、 平假名 、 片假名和汉字 。

那么 Unicode 认为你日本用的汉字 、 韩国用的汉字 、 中国用的汉字以及越南用的汉字 ， 它们都是汉字这一种 script。

**吴涛** [1:12:32]
你们都应该统一起来 。

**Rio** [1:12:34]
既然明明是一个字 ，而且写法基本上也一样 ， 那为什么不能就用一个码位 ？

**吴涛** [1:12:38]
比如说汉字一 、 二 、 三 ， 各个地区大家都长得都一样 ， 就没有必要用三个码位分别的码位嘛 。 所以呢 ， 大家比如说汉字的 " 一 "， 那大家就统一起来吧 。

嗯 。

**Rio** [1:12:49]
那所以这里就牵涉到一个所谓的这个汉字的追根溯源的问题了嘛 。 就是说 ， 呃 ，因为日文和韩文里面的汉字 ， 它的来源是来自于中文的那个字嘛 。

那就是说 ， 呃 ， 就要问日本人民说 ， 哎 ， 你们觉得你们这个汉字是对应到中国的哪一个啊 ？ 还 ， 还要问韩国人民说 ， 哎 ， 你们认为你们这个汉字对应到中国的哪一个啊 ？

那肯定 ， 肯定会出现 。

**吴涛** [1:13:13]
听说要对应到中文 。

**Rio** [1:13:14]
对 ， 对 ， 对 ， 就是那肯定会出现一种情况 ， 就是说他们觉得 ， 就是韩国人觉得我这个字应该对应到中文那个字 ， 然后日日本人觉得这个字我应该对应到中文另外一个字 。

**吴涛** [1:13:24]
对 ， 对 ， 非常 ， 非常的混乱 。 嗯 。

**Rio** [1:13:27]
对 。

**吴涛** [1:13:28]
OK， 这怎么解决的当时 ？

**Rio** [1:13:29]
啊 ， 首先一个原则就是 ， 呃 ，在做 Unicode 的时候 ， 大家各个国家先把各国的那个标准拿出来嘛 。 日本又能拿出它的 GIS， 韩国拿出它的 KS， 呃 ， 咱们中国拿出来是 GB， 还有台 ， 呃 ， 台湾地区还有他们拿出他们的大五嘛 。

然后呢 。

**吴涛** [1:13:47]
哎 ， 等 ， 中国拿的是 GB 哪一个 ？18030 还是 GBK 还是 GB2312？

**Rio** [1:13:51]
呃 ， 不同的历史阶段应该拿出的是不同的文件 ， 对 。

**吴涛** [1:13:54]
好吧 ，但 ，但中文的情况比较简单 ，因为至少它是我们是相互兼容的嘛 。

**Rio** [1:13:58]
嗯哼 ， 对 ， 对 。

**吴涛** [1:14:00]
就还不至于说乱掉这种情况 。

**Rio** [1:14:03]
对 。

**吴涛** [1:14:03]
然后， 呃 ， 先拿出来的时候呢 ， 就是各个国家拿出来 ， 它如 ， 它的一个首先一个原则就是说 ， 如果你在这些字哈 ， 原来你在这个规 ， 比如说在 GB 里面它本来就是两个字的话 ， 那我放到这个 Unicode 里面也是两个字 ， 就是原规则分开的话 ， 我现在也分开 ， 我不会给它合在一起 。

嗯 ， 这因为它要保证就是所谓的向后兼容嘛 。

**Rio** [1:14:28]
但这里有个问题哈 ， 就是说 ，因为就我理解就日文的汉字和这个朝 ， 这个韩文的汉字里面应该都是对应的繁体字吧 ？

**吴涛** [1:14:37]
不一定 。

**Rio** [1:14:38]
不一定 ， 非常复杂 。

**吴涛** [1:14:39]
不一定 。

**Rio** [1:14:40]
对 。

**吴涛** [1:14:41]
OK。

**Rio** [1:14:41]
因为日文有日文汉字 ， 然后刚才说嘛 ， 各个国家的简化都不一样 ， 比如说新加坡它有新加坡的简化汉字 ， 然后日文有日文的简化汉字 。

**吴涛** [1:14:51]
日文还有简化汉字 ？

**Rio** [1:14:52]
对 。

**吴涛** [1:14:52]
嗯 。

**Rio** [1:14:53]
有啊 。

**吴涛** [1:14:54]
而且还有经常会简化以后张冠李戴的字 ， 比如说 ， 呃 ， 文艺的 " 艺 "，在日文的这个文艺的 " 艺 " 的简化就是草字头底下一个白云的 " 云 "。

**Rio** [1:15:05]
然后这个字在中文里面是有的 。

**吴涛** [1:15:08]
中文里面是另外一个字 。

**Rio** [1:15:09]
为什么会出现这种情况呢 ？ 就因为你国没有权利去管理我 ， 去约束我国怎么简化字 ， 对吧 ？

**吴涛** [1:15:16]
不不 ， 我 ， 我是这个意思 ， 就是说 ， 就是日文简化那个 " 艺 "，" 艺 " 字简化成 " 云 " 的时候 ，他们没有去看一下别人怎么做 。

**Rio** [1:15:25]
是平行发展 。

**吴涛** [1:15:26]
他为什么要去看别人怎么做呢 ？

**Rio** [1:15:28]
OK。

**吴涛** [1:15:28]
就我国 ， 就在日本里面 ，在日本的汉字里面没有 " 云 " 这个字嘛 ， 就没有上草下云这个字 。

**Rio** [1:15:34]
啊 。

**吴涛** [1:15:35]
那他为什么不能用呢 ？

**Rio** [1:15:36]
所以嘛 ， 就是说嘛 ， 如果人的历史可以改写的话 ， 当年如果大家简化汉字都商量一下就好了 。

**吴涛** [1:15:42]
不是如果 ， 对 ， 如果我们黄汉早 ， 早一点统一世界的话 ， 就没有这种 。

**Rio** [1:15:46]
哈哈哈 。

**吴涛** [1:15:49]
或者 ， 对 ， 从 ， 从这个今日的角度讲 ， 如果当年大日本建立什么东亚共荣圈呢 ，也没有这个问题 。

**Rio** [1:15:56]
啊 ， 对 ， 就解决一切问题都不成问题了 ，是吧 ？

**吴涛** [1:15:59]
对 ， 一切 ， 一切 ， 一切技术问题其实归根结底都是政治问题 。

**Rio** [1:16:04]
是的 。

**吴涛** [1:16:04]
所以呢 ， 最初期 。

**Rio** [1:16:06]
比如说那出现这种情况怎么解决呢 ？ 就是比如说刚才说文艺的这个 " 艺 " 字的时候 ， 到 Unicode 里面怎么办 ？

**吴涛** [1:16:12]
就只能各给一个码点嘛 。

**Rio** [1:16:14]
嗯 ，但是 ， 嗯 ， 现在事实上呢 ，是只有一个码点 ， 然后这个码点呢是草 ， 上， 呃 ， 草字头一个云 ， 然后呢 ， 日本人用这个字把它当成艺术的意思在用 。

**吴涛** [1:16:25]
" 艺 " 字 。

**Rio** [1:16:25]
中国人用这个字拿出当 。

**吴涛** [1:16:28]
云 ， 云 ， 众生的云 。

**Rio** [1:16:29]
对 ，因为只是 ， 只是编码 ， 然后用来显示嘛 。 至于它是什么语义 ， 这个是没有关系的嘛 。

**吴涛** [1:16:38]
哦 ，OK， 这相当于一中各个 。

**Rio** [1:16:40]
哈哈哈 。

**吴涛** [1:16:41]
你 。

**Rio** [1:16:41]
就只规定 ， 只规定形状 ，不规定意义 。

**吴涛** [1:16:44]
对啊 ，因为本来 ， 本来你这个收的那个字符集的话 ， 只是给每个字编一个座位而已嘛 。

**Rio** [1:16:52]
嗯 ， 对 ， 对 ， 它并不需要赋予含义 。

**吴涛** [1:16:55]
对 ， 现在首先他们在 CJK 统一汉字 ， 只是大家各 ， 各自把各国选手拉出来嘛 ， 对吧 ？ 嗯 。

**Rio** [1:17:01]
OK。

**吴涛** [1:17:02]
所以最初的统一汉字呢 ，有 20,900， 呃 ，941 个字 ， 然后呢 ， 中国国标当时就是拉出了那个 2312 和 12345。 嗯 ， 然后台湾的 ， 台湾有他们的 CNS， 啊 ， 嗯 ， 然后日本呢 ， 日本就是 GIS 的那个 0208， 呃 ， 大概也是有 11,000 多个字 。

嗯 ， 韩国的话 ， 韩国特别坑 ， 汉字不是有多音字嘛 ？ 韩国的他们那个 KS 的那个编码里面呢 ， 它只是因为大家知道韩文它是发音嘛 ， 它发音会对一个字 ， 那多导致于多个发音都对同一个汉字 。

**Rio** [1:17:45]
啊 ？ 那他们怎么解决这个问题 ？

**吴涛** [1:17:47]
他们没有解决这个问题 。

**Rio** [1:17:48]
没有解 ，他们没有解决这个问题 。在韩文的他们 KS 的那个编码里面 ， 汉字有重复 。

**吴涛** [1:17:55]
就是 ， 啊 ， 它是取音的 ， 呃 ， 它是取形和音 ， 就是同一个形 ，但不同读音的时候 ， 比如刚才我们那个曲吧 ， 歌曲和这个 ， 呃 ， 曲线 ， 它会 ， 它会把它有两个码点 。

**Rio** [1:18:07]
对 ， 所以在韩国的 ， 比如说 KSC 的那个 5601 里面 ， 它有 4,888 个字 ，但是呢 ，其中呢 ，有 268 个字是重复的 。

**吴涛** [1:18:16]
然后转到 Uni， 这个 Unicode CJK 的时候都 ， 我们都给它合一了吗 ？

**Rio** [1:18:21]
没有合一 ，因为要保留 ， 就是说 。

**吴涛** [1:18:23]
还要相互兼容 。

**Rio** [1:18:24]
字元分离原则 。 刚才说了 ， 我们说的第一个原则就是字离分 ，有 ， 呃 ， 字元分离原 ， 原来是 ， 原来是分的话 ， 我必须要分 ， 要不然的话你就没办法相互兼容的嘛 。

呃 ， 就所谓的相互兼容 。

**吴涛** [1:18:37]
啊 ，OK。

**Rio** [1:18:38]
OK，OK。 所以 ， 所以就说 CJK 这个 ， 这个 Unification 其实是说中国的汉字和日本的汉字和韩国的汉字如果有 ， 如果长得差不多的就混成一个 ，但是如果他们本身里面是有两个的 ， 我们就不合了 。

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

**Rio** [1:18:52]
嗯 。

**吴涛** [1:18:53]
所以呢 ， 导致于这个合和分的这个规则特别的混乱 ，有的该合的不合 ， 该分的不分之类的 。

**Rio** [1:19:02]
所以其实为了 ， 就为了省那么 ， 那么小几个码点 ， 我不如说直接复制过来 ， 就画区嘛 ， 跟那个 IP 地址一样 ， 说这一块你们中国人拿去啊 ， 够用了吧 ？

不用再升级了吧 ？

**吴涛** [1:19:12]
随便你怎么样 。

**Rio** [1:19:13]
对啊 ， 随便你怎么样 。 然后这 ， 这一块韩国人你们拿去 ， 随便你们怎么弄 。 然后这块日本人拿去 ， 你们随便怎么用 ， 对吧 ？

这不会更 ， 会更简单一点 ？

**吴涛** [1:19:21]
但是这样就背离了 Unicode 想要 Unified 的这个初衷了嘛 。Unicode 一开始的一个目的不就是让所有的字形如果相似的话 ， 就是 ， 就他们的意思就是 ， 如果这个世界上有这样一个符号 ， 它在哪里的写法都是 ， 都基本上是同一个事物 ， 比如说白云或者是 。

**Rio** [1:19:41]
但那个 ， 那个可以用那个 Normalization 来解决嘛 。

**吴涛** [1:19:46]
嗯 ， 比较复杂 。 然后因为 ， 然后 。

**Rio** [1:19:50]
这可是 Normalization 最终的结果不就还是会像现在一样吗 ？

**吴涛** [1:19:53]
不 ， 就是 ，但是是一个 ， 一个是可选 ， 一个是强加的问题嘛 。 对吧 ？ 因为 Unification 是你在制定规范的时候要 ， 要选 ， 就给 ， 就申请 IP 地址的时候 ， 申请这个码位的时候 ， 就要先选好说我们这个共用一个码位嘛 。

但是就是说你又要保持相互兼容的话 ，其实做这个事情是平白无故增加了复杂度嘛 。 那如果你说 Normalization 作为一个事后的一个东西 ， 就虽然我可以相互兼容 ，但是为了说得出来大家都还能够一个可比的话 ， 我们再用一个 Normalization 的规则把它换成一个统一的表达不就好了嘛 ？Make sense 哈 ？

**Rio** [1:20:26]
呃 ， 可 ， 好吧 ， 你可以这么说 ，但我觉得 Unicode 的初衷可能是接 ， 就是 Unicode 在 Unicode 制定的理念里面 ， 兼容既有编码并不是占第一位 。

**吴涛** [1:20:39]
对 。

**Rio** [1:20:40]
就是 ， 呃 ，Unicode 的理想是就是从 Unicode 之后再无 ， 再无别的编码了 ， 对吧 ？

**吴涛** [1:20:47]
OK。

**Rio** [1:20:48]
那 ， 那如果你说你一定要保留原有的那个东西 ， 那 ， 那相当于 。

**吴涛** [1:20:52]
就不要合 。

**Rio** [1:20:52]
Unicode 的初衷就没有了嘛 。

**吴涛** [1:20:54]
它的 ， 它的主要诉求其实一开始的确就是为了大幅度减少这个收录的汉字的字数嘛 。 然后呢 ， 尽 ， 然后就尽量去尊重各地的习惯字形嘛 。

那就是你原来是分离的 ， 你就分离嘛 ， 然后能合的就合在一起嘛 。

**Rio** [1:21:08]
嗯 。

**吴涛** [1:21:08]
啊 。

**Rio** [1:21:09]
对 ， 就还是统一为主兼容为主 。

**吴涛** [1:21:12]
对 ， 对 ，是比较灵活 ，但是就因为这个灵活的方式就 。

**Rio** [1:21:15]
灵活就是复杂度嘛 。

**吴涛** [1:21:18]
所以他说他的编码是针对字 ，而不是对字形 ， 就是对 character 进行编码 ，而不是对 glyph。

**Rio** [1:21:25]
OK， 明白 ， 明白 ， 明白 。 那其实 ，其实也不太对 。 刚刚 ， 刚刚你说那个文艺的 " 艺 " 字就不符合这个逻辑了 。

**吴涛** [1:21:32]
嗯 ， 呃 ，但是呢 ，他们只是对字啊 。

**Rio** [1:21:35]
啊哈 。

**吴涛** [1:21:36]
啊 ， 所以就很复杂 ， 的确 。 像 ， 呃 ， 像合起来 ， 比如说那个户口的户 ， 中国大陆的话 ， 户的第一笔是点吧 ？

在 。

**Rio** [1:21:45]
对 。

**吴涛** [1:21:46]
日本是一横 ， 然后呢 ， 台湾是一撇 。

**Rio** [1:21:50]
是方向不一样吗 ？

**吴涛** [1:21:51]
但是这个字呢 ，在 Unicode 的话 ， 就认我们被当时就是认为是一个字嘛 ， 所以呢 ， 就只给它一个座位 。 就导致于就是各个地区如果想要他们各自的字形的话 ， 就显示不出来 ， 就要不能通过这个就码位来 ， 来展现了嘛 。

**Rio** [1:22:11]
就只能通过字体格力度来实现了嘛 。

**吴涛** [1:22:14]
对 。 所以 ， 所以就是说这不是字的区别 ，而是字形的区别 。

**Rio** [1:22:19]
那等一下， 我 ， 我有一个问题哈 。 如果是这样的话 ， 我们做那种就是多语言文本的时候怎么办 ？

**吴涛** [1:22:25]
所以非常仰 ， 嗯 ， 依靠你所用的那个字库文件 。

**Rio** [1:22:31]
但字库文件不可能啊 ， 就它会有这种 ， 就是对应一个码位它有多个字形的 。

**吴涛** [1:22:39]
对 ， 比如说 。

**Rio** [1:22:41]
OK。

**吴涛** [1:22:41]
Source handsense， 资源黑 。

**Rio** [1:22:44]
呃 ， 应该说它是唯一的一个 ， 对 ， 它是现存世上唯一一个能找到试图去解决刚才 Rio 提出这个问题的这样一个字体工程项目 。

**吴涛** [1:22:54]
对 ，但是 ，但是如果说 ， 呃 ， 举个很简单例子 ， 假设我要做这个 CJK，不 ， 就是你们 ， 我们假设字谈字畅要出一个节目 ， 然后出一个这种印刷品来说这几个字的区别 ， 然后你们用 Unicode 编码的时候要写出这几个字 ， 你能采取的方案就只有两个 ， 要么找这种带有这个 CJK 不同字形 variation 的这种字体文件 ， 一个可以搞定 ， 然后你在那个 ， 那个就是编辑器里

面去选择它 ， 另外一个就是说选三个不同的字体 ， 然后手工的去调那个字体 ， 对 ， 那 ， 那一个字应该用哪个字体 。

**Rio** [1:23:27]
对的 。

**吴涛** [1:23:27]
对 ，是的 。

**Rio** [1:23:29]
啊 ，OK。

**吴涛** [1:23:29]
这种时候可能直接写 markdown 会比较简单吧 。 就你 ， 你要么在 Unicode 层面确保你写的每一个字是正确的 ， 否则就只能用 markdown 来 ， 来 ， 来辅助 。

**Rio** [1:23:41]
呃 ， 怎么弄 ？

**吴涛** [1:23:42]
什么 markdown，sorry， 就是 。

**Rio** [1:23:43]
Markup。

**吴涛** [1:23:44]
我指的其实就是 HTML， 就是你在那个时候标出说这一段文字是日文的 。

**Rio** [1:23:49]
对 ， 对 ， 对 ， 没错 。

**吴涛** [1:23:50]
到时候再在那个 CSS 里面指定说这一段用日文字体 。

**Rio** [1:23:54]
是的 ，是的 。

**吴涛** [1:23:54]
就不能直接用一个很简单的那种 。

**Rio** [1:23:56]
就你得加人为的加入一些 metadata 才行 。

**吴涛** [1:23:59]
对 ， 对 ， 对 。 所以其实还是刚才那个问题嘛 ， 就是刚才 Unicode 这个 Unification 它是带来的后果 ， 就是在混排文字的时候出现那种不可指 ， 就是不能很方便的指定的情况下 。

因为理想情况下， 如果这三个在那个户字的那个三个国家的不同写法是没有统一的话 ，其实你是很可 ， 可以很方便的让系统自动去 fallback 到对应国家的那个 ， 那个字上面去的 。

**Rio** [1:24:20]
但是话说回来 ， 如果真是混排系统的话 ， 你别说是机器了 ， 连人都看不出来 。 比如说中国两个字 ， 中国大陆的写法和日本的写法是完全一模一样的 。

所以呢 ， 如果你单写中国两个字 ， 你不知道这是日文还是中文 。

**吴涛** [1:24:34]
而且你不知道它指的是中国还是日本的中文 。

**Rio** [1:24:36]
对 ， 意思也不一样 。

**吴涛** [1:24:37]
对 。

**Rio** [1:24:37]
哎 ，因为日本也有中国地区 。

**吴涛** [1:24:39]
哎 ， 这啊 ， 什么意思 ？

**Rio** [1:24:41]
日本有一个地区就叫中国 。

**吴涛** [1:24:44]
啊 ， 所以这就是为什么在 ，在历史上， 呃 ， 日本管中国 ，他们喜欢叫支那 。 就是因为如果说中国的话 。

**Rio** [1:24:52]
区别 ，是吧 ？

**吴涛** [1:24:52]
对 ，他们就指的是日本的中国地区 ， 就是广岛的那附近 ， 那叫日本 ， 那是日本的中国地区 。

**Rio** [1:24:59]
对 ， 所以他们选择了这个法语词的发音 ，是吧 ？ 看起来比较洋气 。

**吴涛** [1:25:04]
支那不是法语词 。

**Rio** [1:25:06]
应该是吧 ？ 它应该是那个 China 的那个 。

**吴涛** [1:25:09]
支那是从 Sina 来的吗 ？

**Rio** [1:25:11]
就是印度 ， 就是 。

**吴涛** [1:25:14]
啊 ，是印度那边过来的是吧 ？

**Rio** [1:25:16]
印度嘛 。

**吴涛** [1:25:16]
就是那个什么 Sino。

**Rio** [1:25:18]
Sino， 对啊 ， 现在英文也是我们 。

**吴涛** [1:25:20]
对 ，Sinopec。

**Rio** [1:25:21]
对啊 ， 就是同源嘛 。

**吴涛** [1:25:22]
对啊 ， 就像什么 Sino。

**Rio** [1:25:24]
Sino-American relationship， 对吧 ？

**吴涛** [1:25:26]
对 ， 对 ， 对 。

**Rio** [1:25:27]
你就是这个词源 。

**吴涛** [1:25:28]
有时候就挺 ， 就有时候看那个说 ， 说支那是一个什么歧视性的称呼 ， 我就觉得挺扯的 。 你自己翻英文的时候 ， 你不写的什么 Sino 什么什么 。

**Rio** [1:25:37]
所以其实支那这是 ， 这是一个历史上就很常用的一个词 。 对 ， 只是到因为到后面打仗了以后才变成有歧视 ，在原来它完全没有这个意思的 。

嗯 ， 就没有歧视的 。

**吴涛** [1:25:48]
明白 ， 明白 。

**Rio** [1:25:49]
OK。

**吴涛** [1:25:50]
所以的话 ， 就是个退回来讲 ， 就是你如果单纯写这 ， 这中国这两个字的话 ， 你更别说是机器了 ， 连人也看不出来这到底是中文还是日文 。

所以呢 ， 还 ， 还是要 ， 呃 ， 非常仔仔细细的去 mark。

**Rio** [1:26:04]
对 ， 你需要给它一个 locale 的这样一个信息 ， 它才能更加正确和精确的显示这个你所想要的结果 。 这其实是一个信息处理的一种架构或者哲学吧 。

这个其实大家可以去看那个小林健写的那本 CJKV 的这个信息处理的那本书了 。他应该算是一个这方面的专家 ， 然后他应该方方面面都会照顾到这些问题 ， 然后告诉你在不同的层面他们分别是用什么样的技术去解决的 。

我们不可能依赖 Unicode 这样一种技术方案来解决所有的问题 。

**吴涛** [1:26:40]
嗯 。

**Rio** [1:26:42]
哎 ， 所以 ， 所以刚才你们说那个中文的中国和日文的中国在 Unicode 里面是不同的点位 ？

**吴涛** [1:26:47]
一样 ， 是一样的 。

**Rio** [1:26:49]
啊 ， 一样的点位 。

**吴涛** [1:26:49]
完全一样的点位 。

**Rio** [1:26:50]
OK。 但是一 ， 写出来是一样的吗 ？ 就不涉及这个问题 。

**吴涛** [1:26:53]
写出来完全一样 。 对 ， 对 ， 没错 。

**Rio** [1:26:55]
OK， 对 。

**吴涛** [1:26:55]
那就靠语境 。

**Rio** [1:26:56]
写出来完全一样 ， 取决于你从谁的角度来看 。

**吴涛** [1:26:59]
不 ，不 。

**Rio** [1:26:59]
就是假如你是一个 ， 嗯 ， 日本人写了中国两个字 ， 然后你让中国来看 ， 呃 ， 可能看不出来 。 但如果你用一个日文字体的话 ， 你会看到中国这两个字在日文和中文字体里面有不一样的风格 。

所以你多少还是能判断出来这是一个 ， 就是有可能你可以判断出来这是日文的中国还是中文的中国 。

**吴涛** [1:27:18]
那就是就看语义了嘛 ， 就是看那个上下文在讲什么 。

**Rio** [1:27:21]
不是看语义 ， 就看字形 。

**吴涛** [1:27:22]
他的意思是那个看 design。

**Rio** [1:27:24]
因为 。

**吴涛** [1:27:24]
看那个形状 。

**Rio** [1:27:26]
啊 ， 那 ， 那个 。

**吴涛** [1:27:27]
每个国家的那个字形的标准都有多少的区别 。

**Rio** [1:27:31]
啊 ， 那是 design 风格的问题 ， 设计风格的问题 。 所以呢 ， 这个 CJK 统一 ， 呃 ， 统一汉字就统 ， 它叫统一表意文字啊 。

嗯 ， 就一 。

**吴涛** [1:27:43]
嗯哼 ， 对 。

**Rio** [1:27:45]
所以后来就 ， 啊 ， 一直 ， 当然字数不够用嘛 ， 所以就一直扩展 。 然后后面就扩展 A 区 ， 扩展 B 区 。

我们 ， 我们简 ， 嗯 ， 大陆说扩展 ABCDE， 现在已经有 E 区了嘛 。 台湾他们那边说扩展甲乙丙丁戊啊 ， 这个说法不一样而已 ，其实东指的东西是一样的 。

现在有 F 区了 ，是吗 ？ 都已经到 。 所以字是越来越多 ， 越来越多 。

**吴涛** [1:28:07]
好像 ， 好像是有了 。

**Rio** [1:28:09]
各种考古挖出来一些新字也得加进去嘛 。

**吴涛** [1:28:13]
对 ， 什么 ，而且什么篆 ， 篆 ， 小篆啊 ， 大篆啊之类的也都可以加进去 。

**Rio** [1:28:17]
嗯 ， 对啊 ， 就是 。

**吴涛** [1:28:19]
呃 ， 所以呢 ， 嗯 ，因为本身 Unicode 它本身也一直都在更新嘛 。 嗯 。

**Rio** [1:28:25]
嗯嗯 。

**吴涛** [1:28:25]
呃 。

**Rio** [1:28:27]
是 。

**吴涛** [1:28:27]
至少 Unicode 8.0 的话已经有扩 ， 已经到扩展 E 区了 。 就是已经有了 ， 就是已经收 ， 已经收进去了 。

对 。

**Rio** [1:28:36]
所以以后我们不能说把那个什么扫进固纸堆里面 ， 我们得扫进 Unicode 这个垃圾坑里面 。

**吴涛** [1:28:46]
好 ， 这是说到 Unicode 这个字的问题 ， 对吧 ？ 然后 Unicode 的编码问题呢 ？

**Rio** [1:28:51]
啊 ， 这个坑就大了 。 之前吴涛在那个那一单 ， 那期单口节 ， 节目里面已经大概讲过了哈 ， 这里要不要再重申一遍 ？

### 编码与端序

**吴涛** [1:29:00]
为什么你们都记得那期我讲了什么 ？ 我现在完全不记得自己那一期讲了什么 。

**Rio** [1:29:04]
哈哈哈 ， 我也录这节目还特地翻出来听了一遍 。 哈哈哈 ， 结果听到后面居然是程序员怎么找女朋友 ，有这什么鬼 ？

**吴涛** [1:29:13]
而且我 ， 我 ， 我也写了一篇很简单的一个 ， 一个博客吧 ， 去 ， 去说这个 ， 大概记录了一下我当时学习这个坑的一个结果 。

**Rio** [1:29:21]
嗯 ， 这个编码方式那个 UTF-8 和 UTF-16 啊 ， 什么什么的 ， 你们详细的说一下 。

**吴涛** [1:29:29]
其实这个坑还蛮多的 ， 这个我可以讲一下 。

**Rio** [1:29:32]
嗯哼 。

**吴涛** [1:29:33]
对 ， 就最开始的时候其实没有 UTF-16 的 ， 最开始的时候就叫 UCS2。

**Rio** [1:29:39]
啊 ， 对 ， 没错 。

**吴涛** [1:29:40]
这个坑也是一个历史遗留问题 。 对 ， 然后 UCS2 其实它只是编码了刚才讲那个叫做 BMP 嘛 ， 就是基本平面 。

**Rio** [1:29:51]
嗯 。

**吴涛** [1:29:51]
就是一共有 65,536 个点 ， 对吧 ？ 然后就 ， 就很简单嘛 ， 就 ， 就是没有 ， 没有任何额外的东西 。 然后 UCS2 和 UTF-16 的区别是什么呢 ？

就是 UTF-16 里面其实是等于 UCS2， 然后加了那个 ， 那个叫做 Seregate pair。

**Rio** [1:30:11]
Seregate pair 中文叫什么 ？

**吴涛** [1:30:13]
有 。

**Rio** [1:30:13]
代理对 ？

**吴涛** [1:30:14]
啊 ， 我不知道 。

**Rio** [1:30:17]
对 ， 我不是一直不知道中文叫什么 。

**吴涛** [1:30:20]
就或者 ， 或者这么理解吧 ，UCS2 可以大致等同于这个 GB 2312 对于中文的概念 ，因为它就是一个定长的 ， 没有任何特殊东西的 ， 就只是那么多个点位而已 。

然后当时 ，但是因为当时已经突破了那个基本平面了嘛 ， 对吧 ？ 就是要想 ， 要 ， 要 ， 要想办法表达 65,536 个 ， 呃 ， 这个点之外的东西怎么办 ？

想出了这么一个 hack， 就是说在那个基本平面里面抠出了一小段 ， 大概是我看看哈 ， 这个是这个 16 进字编码是 D800 到 DFF， 呃 ， 这 ， 这 ， 这几个 ， 呃 ， 字符是用作 Seregate pair。Seregate pair 是什么意思 ？

等于是从两个字节的一个定长编码里面 mark up， 就是刚才讲吴涛说的 。

**Rio** [1:31:09]
做标记 。

**吴涛** [1:31:09]
用一个 ， 对 ， 做了一个特殊标记 ， 说从这些字符之间的东西你要进行一个特殊处理 ， 使得我们可以超出基本平面那个 65,536 个字符的限制 。

啊 ， 这个就是 UTF-16。

**Rio** [1:31:23]
他当时做出这个编码方案其实就还是为了省， 省资源 ， 对吧 ？ 就是节省编码 。

**吴涛** [1:31:29]
不 ， 就是对 ， 对 ，是因为是这样 ， 就是说如果当时有一个 ， 就刚才讲 UCS2 是一个非常简单的编码方式嘛 ，其实对应的还有一个叫 UCS4， 就是对 ， 就四个字节 ，32 位的东西 。

然后 UCS4 本质上就是 UTF-32。

**Rio** [1:31:46]
对 ， 它 ， 它是一个 。

**吴涛** [1:31:47]
它 ， 它两个是一个 。

**Rio** [1:31:48]
它是一个固 ， 固定的 。

**吴涛** [1:31:50]
嗯 ， 对 ， 对 ， 就是定长编码 。

**Rio** [1:31:52]
然后就很浪费嘛 ， 就是你一个字母 A 的话也要用那个 ， 就特别浪费 。

**吴涛** [1:31:56]
嗯 ， 对 ， 对 ， 所以后来权衡一下就说我们还是用 ， 就是内部还是用 UTF-16， 呃 ， 用 ， 用 UCS2 这个定长的比较好 ，但是要为了超 ， 要解决那个超出基本平面的问题 ， 所以加了这个 Seregate pair 这种 ， 这种 hack， 使得 UCS2 变成了 UTF-16， 这么一个过程 。

**Rio** [1:32:17]
就看那个标记 ，有了这个标记以后， 啊 ， 就我就要用另外一个了 ， 对吧 ？

**吴涛** [1:32:22]
就是 ， 就是你搜嘛 ， 搜那个 UCS2 里面的那个 Seregate pair， 那 ， 那段是没有 ， 没有定义意义的嘛 。 那用上这人为规定说 ， 如果你看到有这种 ， 这种 Seregate pair 的字符 ， 就知道你这个是 UCS，UTF-16。

所以这些 Seregate pair 里面东西你要特殊处理嘛 。

**Rio** [1:32:38]
嗯嗯 。

**吴涛** [1:32:39]
啊 ， 反正也是一个很 ， 很大 ， 很大的坑 。 啊 ， 然后说到这个定长编码 ， 就 Unicode 定长编码就会牵涉到一个这个所谓的这个顺序的问题 。

**Rio** [1:32:49]
啊 ， 这又是一个更大的坑 。

**吴涛** [1:32:53]
对 ， 深坑 。

**Rio** [1:32:54]
啊 ， 这其实是那个非单字节编码都要牵涉 。

**吴涛** [1:32:58]
对 ， 非单字节编码都有 ， 都有这个很明显的问题 。 这个不光是在字符编码上 ，其实在计算机的这个数字的表达上也会有这个问题 。

比如说我们常说计算机一个 ， 一个字节 ， 就最小单位嘛 ，是就是 8 个位 ， 对吧 ？ 但是两个字节就是你表示 16 位整数的时候 ，也会牵涉到哪个是高位 ， 哪个是低位 ， 就哪边是高位 ， 哪边是低位的问题嘛 。

对 ， 然后就会所谓的就我们就会牵涉到那个叫做 Indian，Indian 中文翻成什么 ？

**Rio** [1:33:27]
呃 ， 端吧 ， 就翻成 。

**吴涛** [1:33:28]
端是吧 ？

**Rio** [1:33:29]
端 ， 一般那个就是 。

**吴涛** [1:33:31]
端序 。

**Rio** [1:33:31]
对 ， 我们一般管那个叫端序嘛 。

**吴涛** [1:33:34]
就大端和大尾和小尾 ， 这个是个专有名词 。

**Rio** [1:33:37]
我经常说大头小头 。

**吴涛** [1:33:38]
端序 。

**Rio** [1:33:40]
对 ， 它其实表示的就是头 。

**吴涛** [1:33:42]
大头派小头派嘛 ， 没错了 。 就原 ， 原作是指这个嘛 ， 就在格列佛游记的原作里面是指这个 。

**Rio** [1:33:48]
小人国在打内战的时候 。

**吴涛** [1:33:50]
指的那个意思 。

**Rio** [1:33:51]
说吃鸡蛋要从大头开始敲还是从小头开始敲 ， 然后因此还发过六次叛乱 。

**吴涛** [1:33:58]
啊 ， 对 ， 对 ， 对 ，endian 就是从那个鸡蛋的那个两头那个地方来的吧 ， 好像 。

**Rio** [1:34:02]
对啊 ，他用了那个典故 。

**吴涛** [1:34:04]
嗯 ， 对 ， 对 ， 对 ， 然后， 然后这个坑就比较深了 。 就说简单来讲就是那套 ， 就是对于一个数字来讲哈 ， 比如说对于一个 16 位的整数来讲 ， 你觉得第 ， 就是从左到右数 ， 左边是高位呢还是右边是高位 ， 对吧 ？

**Rio** [1:34:20]
嗯 。

**吴涛** [1:34:20]
没 ， 没 ， 没错吧 ， 我想想 。

**Rio** [1:34:22]
对 ， 对 ， 对 ， 就是大端序的话就是左边是高位 ， 小端序就是右边是高位 。

**吴涛** [1:34:28]
对 ，但是在字符集的时候这个坑就又多了 ， 就会牵涉到 ，因为我想想怎么表述这个东西哈 。

**Rio** [1:34:36]
就是首先你要看它的这个 ， 呃 ， 字节的组合是怎样分成一个一个单元的 ， 然后它在每个单元的内部会有一个端序的这个 。

**吴涛** [1:34:46]
不 ，因为有 ，有 ，有这么一个问题可能要解释一下， 就是说在数字上面我们写一般是说是从左往右写 ， 对吧 ？

我们正常的是个书写顺序 。 但是在表 ， 表达那个如果是位的话 ， 如果你是小端 ， 大端小端 ， 就某一端的时候它是最右边那个位开始起的 。

**Rio** [1:35:04]
因为你想就是低位高位的话 ， 各位数是在右边嘛 ， 然后越高位的话是越往左写嘛 ， 越往左边的是越高位嘛 。

**吴涛** [1:35:13]
对 。

**Rio** [1:35:13]
嗯 。

**吴涛** [1:35:15]
对 ， 对 ， 这个也是一个很深的一个坑 。 就经常 ， 经常我搞不清楚这里面到底是哪个 ，是哪个原理啊 。

就是你 ， 你想如果我们把那个位作为一个图形化的方式表达在眼前的话 ， 你会发现它其实是从 ， 呃 ， 右边开始增加的 。

**Rio** [1:35:33]
嗯哼 。

**吴涛** [1:35:34]
你明白我的意思吗 ？

**Rio** [1:35:34]
对 。

**吴涛** [1:35:35]
就是比如说 0， 呃 ，01， 然后 10， 然后 11，100，110 这样的方式 ， 对吧 ？

**Rio** [1:35:42]
哎呀 ， 我就这样 ， 这说出来好 ， 好 ， 大家肯定晕了 。Anyway。

**吴涛** [1:35:48]
就得 ， 得在脑 ， 脑中画一下 。 对 。

**Rio** [1:35:52]
其实我们只是要认可这个世界上事实上存在了这样两种顺序 。 那么这两种顺序实际上是由计算机这个体系的硬件架构所决定的 。

一派架构它就是以这个小端序来保存它的数据 ，而另一端 ， 另一种架构就是以大端序来保存它的数据 。

**吴涛** [1:36:10]
对 ， 然后这个在我们常用的计算机里面 ， 英特尔架构就是我们现在用的 X86， 它是一个小端设计的 。

**Rio** [1:36:17]
嗯 ， 对 。

**吴涛** [1:36:18]
但是在互联网上， 我们所 ， 基本上所有的这个通讯协议以及这个网络标准全部都是以大端来设计的 。

**Rio** [1:36:26]
所以坑就从这里开始了 。

**吴涛** [1:36:29]
没错 。

**Rio** [1:36:30]
这是不是跟早期的服务器用的那个架构有关 ？

**吴涛** [1:36:34]
因为早期的那个做互联网的那些服务器都不是英特尔的处理器 ， 都是一些其他那些现在已经销声匿迹的那些处理器 。

**Rio** [1:36:42]
啊 ， 都基于 Unix 的其实是 ，是吧 ？

**吴涛** [1:36:45]
不 ， 那个是操作系统的 ， 那个还没有这个 ， 跟那个没有 ， 就这个是一个硬件层 。

**Rio** [1:36:48]
这很低层的 。

**吴涛** [1:36:49]
然后就 ， 对 ， 对 ， 早期的那些很多那个做互联网的服务器啊 ， 还有包括那些开发 ， 呃 ， 就是最开始做什么 OPA 那个那些用的机器 ，他们其实很多都是大端的 ， 就是 Big End 的 。

所以就他们的用的那些机器变成了一个正统 。 然后反而现在我们做小端的那个英特尔的处理器 ， 到时候就为什么你写 C 程序的时候还要有一个什么 ， 呃 ，host H2N，H2L，H2L 和 L2H， 就是转换网络 ， 网络的端和这个本地的这个端 。

**Rio** [1:37:21]
Host to local 是吧 ？

**吴涛** [1:37:22]
啊 ， 对 ， 对 ， 对 ， 对 ， 那个小端序是 VEX 和英特尔的架构 ， 大端序是摩托罗拉和 Sun 的那个架构 。

**Rio** [1:37:30]
没错 ， 没错 ， 就是 ， 就是什么 Spark 啊那些东西 。Anyway， 说回这个啊 ， 就在这个字体 ， 这个 UTF-8 编码 ，UTF-16 和 UTF-32 编码也有这个同样的问题 ， 就是说第一个字节到底代表是小头还是大头 。

所以它要做标注 ， 对吧 ？

**吴涛** [1:37:49]
对 ， 所以为了就是 ，他们就没有说我们大家都规定一律是同用 ， 像比如像网络上大家都规定说 ，因为在所有的这个 RFC 的规范里面 ， 只要涉及网络的都是用的那个大端设计嘛 。

但是在文本上面其实并没有这么一个统一 ， 就是约定俗成的一个规定 。 所以就两种都存在 ， 所以说存在说叫做 UTF-16 就是 L1 和 UTF-16， 呃 。

**Rio** [1:38:13]
B1。

**吴涛** [1:38:14]
呃 ， 大 ，B1， 对 ， 就两种不同的表达方 ， 这个存储方式 。 所以你们看到很多这个 ， 呃 ，Windows 上面的那个 ， 那个文本编辑器吧 ，TeX editor。

**Rio** [1:38:27]
记事本 。

**吴涛** [1:38:27]
存的时候它会给你 。

**Rio** [1:38:28]
记事本 。

**吴涛** [1:38:29]
对 ， 对 ， 对 ， 记事本 ， 对 ， 它会给你这个选项 。 然后因为存在这个 B1 和 L1 的区 ， 这个问题呢 ， 就是很多人， 啊 ， 就为了解 ， 为了标志说这个文本到底是大端还是小端的 ， 我们有一个规定 ， 就是说用 UTF-16 编码的文本会在它的第一个字符 ， 应该是不 ， 前两个字符会放个 ， 放 ， 放一个特殊的标志叫做 bone，byte order mark。

**Rio** [1:38:57]
这叫什么 ？ 字序 ， 嗯 ？

**吴涛** [1:39:00]
字节序列标志 。

**Rio** [1:39:01]
字节序列标志 。

**吴涛** [1:39:02]
那标志这个我这个序列是大 ， 啊 ，是大头还是小头 ？ 啊 。 对 ， 对 ， 对 ， 然后这个 ， 这个 bone 其实是一个两个字节的特殊形 ， 特殊 。

**Rio** [1:39:12]
它是很取巧了 ，因为它 ， 呃 ，其实是那个 Unicode 的那个 FEFF 这个字 ，但是这个字呢叫 Zero Width No-break Space， 就是零宽的一个不 ，不间断的空 。

**吴涛** [1:39:27]
不可分割 。

**Rio** [1:39:27]
不可分割的空白 。 所以呢 ， 它 。

**吴涛** [1:39:30]
对 。

**Rio** [1:39:30]
你表面你看不出来有这个字 。

**吴涛** [1:39:33]
这是一个非常 ， 这是一个很有 ， 很容易把人坑死的坑 ， 就是因为你看不到这个字 。

**Rio** [1:39:38]
对 。

**吴涛** [1:39:38]
你必须用一个能够看见看不到的东西的编辑器来看 ， 你才能看到这个东西 。

**Rio** [1:39:44]
对 ， 对 ， 当时想出这个招的人也应该掏出这个卡来 。

**吴涛** [1:39:48]
对 ， 对 ，但是它 。

**Rio** [1:39:49]
对 。

**吴涛** [1:39:49]
当时就是因为这个字看不见 ， 所以才能用来做这个 hack 嘛 。

**Rio** [1:39:54]
对 ，他当时觉得自己这个 hack 还挺 ， 挺技巧的 ， 对吧 ？

**吴涛** [1:39:57]
嗯 。

**Rio** [1:39:58]
对 ，但是现在的这个 Unicode 规范 ， 它已经不推荐你再把这个 bone 当成这个零宽的空格来用了 ， 它只推荐你用来标记这个字节时 。

**吴涛** [1:40:09]
对 。 现在不是应该用 UTF-8 吗 ？

**Rio** [1:40:13]
哈哈哈 。

**吴涛** [1:40:13]
为什么还有人推荐用 UTF-16？

**Rio** [1:40:15]
啊 ， 就是对于 Unicode 它这个规范书来说 ， 呃 ， 它认为这个字节式的标记即使是对于 UTF-8 的编码也有一定的作用 ，因为它能明确地告诉你这个文本处理的软件 ， 你这个就是用 Unicode 编码 。

**吴涛** [1:40:29]
嗯 ， 好吧 。 不需要 ，UTF-8 不需要这个东西啊 。

**Rio** [1:40:33]
啊 ， 怎么说呢 ， 就是 ， 呃 ，Unicode 它是这样号称的啦 ， 就是说即使你这个用 UTF-8 这样没有端序的编码方式来编码 ， 那么我如果看到了这个 bom 的这个标记位的话 ， 那么我可以提前就知道这些文本一定是用 Unicode 的某一种编码方案来编码的 ， 你就不用去考虑别的编码方案 。

**吴涛** [1:40:56]
对 ， 就 ， 就是说那 ， 那这里就会 ， 会设计一个问题 ， 就是说在其他所有编码方案里面都没有出现过 bone 这个东西是吧 ？

**Rio** [1:41:04]
啊 ， 就不会在开头 。

**吴涛** [1:41:06]
如果 。

**Rio** [1:41:07]
或者说它做了一个约定 ， 一旦在开头出现这个标记位的时候 ， 我就认为它是那个 Unicode 编码的一个 。

**吴涛** [1:41:13]
它能做出这个约定 ， 它肯定是说统计过市面上所有存 ， 现存用过的这个编码方案 ，不管是日本的 、 韩国的还是在欧洲的也好 ， 它的都不会出现这么一个 ， 这么一个组合嘛 。

**Rio** [1:41:25]
就是这个 FEFF 是位 。

**吴涛** [1:41:28]
对 ， 那应该是 ，因为这个字符本身 ， 呃 ， 作为一个非标记字符来用 ， 它就是一个很罕见的嘛 ， 它是一个零宽的这样一个空格 。

如果你正确地使用这个空格的话 ， 它是不会出现在这个一个字符串的开头的 ，因为它的语义决定了它一定是出现在一些字符串的中间的 。

**Rio** [1:41:48]
OK, makes sense。Anyway， 无论如何怎么说 ， 这还是一个 bad idea。

**吴涛** [1:41:56]
它的存在就是一个 bad idea。

**Rio** [1:41:58]
所以那个 Windows 记事本的 ， 呃 ， 你在保存这个文件的时候 ， 它有个选项叫 Unicode， 然后又有个选项叫 Unicode Big End， 然后如果 ， 那就大家会想什么鬼 ，因为它是第一个选项 Unicode， 它就是默认地说这个就是 UTF 的 16，而且呢 ，是默认是小头的 ， 所以它还会有另外一个选项是 Unicode Big End， 这个用大头来保存 。

**吴涛** [1:42:23]
所以这也是一个坑 ， 对不对 ？ 因为你选 Unicode，Unicode 并不是一个编码方式 。

**Rio** [1:42:27]
对啊 ，而且然后它还有第三个选项是 UTF-8， 这其实也是 ， 如果你要这样想 ， 这是 Unicode 的一种编码方式而已嘛 。

**吴涛** [1:42:35]
就是它把 ， 它把两个完全不在一个逻辑层面的概念全部放在一堆 ， 然后揉成了一堆 。

**Rio** [1:42:42]
对 ， 它这个菜单显示得很奇怪 ， 就是它不应该这样表述 。

**吴涛** [1:42:46]
对 ， 它的这个术语比较乱了 。

**Rio** [1:42:48]
所以把那个什么做记事本的那个产品经理拖出去砍了 。

**吴涛** [1:42:52]
你今天要砍多少人呢 ？

**Rio** [1:42:54]
哈哈哈 ， 就不 ，不合逻辑的通通砍死了 。

**吴涛** [1:42:59]
嗯 。

**Rio** [1:42:59]
所以 Windows 记事本它到保存了以后呢 ， 它 ， 啊 ， 这个 bone 大 ， 大家都会有是吧 ？ 嗯 ， 写标记了以后 。

**吴涛** [1:43:07]
呃 ，不会 ， 呃 ， 只会用 ， 就在一个正常符合逻辑的编辑器里面 ， 它应该只会用 UTF-16 或者 UTF-3。 哎 ， 等下，UTF-3 好像是规定的 endian 顺序 。

**Rio** [1:43:19]
呃 ， 它也有两种顺序可以用的 ， 就是说 16 和 32 的时候 。 所以这就是为什么 Windows 它会在那个 Unicode 上面加一个 ， 呃 ， 带不带 B1 这个标记的区分了 。

**吴涛** [1:43:32]
不 ，但是它里面不能选 UTF-32 啊 。

**Rio** [1:43:36]
啊 ， 对 ， 它的产品逻辑是说就是当我标明了这个 bone 的时候 ， 它有可能是用 UTF-16 编码 ，也有可能是用 32 编码了 ， 所以它就用 Unicode 来指代这两种 。

哈哈哈 ， 然后同时呢 ， 它那个认为 UTF-8 是不需要这个的 ， 所以它说 UTF-8 的时候呢 ， 只用一个标准的编码方案来指代它现在的这个文件状态 。

**吴涛** [1:44:00]
Jesus。Anyway， 就是我们最终得出结论就是千万不要用 Windows 记事本 ， 如果你也要用 TeX， 务必记得用 UTF-8 编码 。 或者说从今天开始 ， 所有的涉及跟文字相关的 ， 跟编程相关的 ， 任何是有文本的东西 ， 一定要用 UTF-8 来编 ， 就可 ， 就来存就可以了 。

其他的都是 ， 都是邪教 。

**Rio** [1:44:22]
嗯 。 哎 ，Windows 记事本会在 UTF-8 的编码文件里面还会加 ， 加一串字 。

**吴涛** [1:44:29]
是 。

**Rio** [1:44:29]
加一个字节串 。

**吴涛** [1:44:30]
没错 ， 所以这个是要 。

**Rio** [1:44:32]
它为什么还要画蛇添足呢 ？

**吴涛** [1:44:33]
就 ， 就刚才你说那个问题嘛 。

**Rio** [1:44:35]
虽然是 UTF-8，但是它又加了一个这个 。

**吴涛** [1:44:39]
它还是想加一个这个东西 ， 它觉得保险嘛 。

**Rio** [1:44:43]
让人家知道 ， 呃 ， 这我 ， 我这肯定是 Unicode 是吧 ？

**吴涛** [1:44:46]
所以对吧 ， 拖出去砍了是很正常的处理方式 。

**Rio** [1:44:48]
好吧 。 哈哈哈 。

**吴涛** [1:44:54]
好 ，Windows 的那个坑终于踩过了 。 现在我们来讲这个 ， 啊 ，UTF-8 还没讲哈 。

**Rio** [1:44:59]
UTF-8 需要讲吗 ？

**吴涛** [1:45:00]
呃 ，UTF-8 其实挺 ， 挺好解释的 ， 可以讲 。

**Rio** [1:45:04]
说吧 。

**吴涛** [1:45:04]
那就说吧 。

**Rio** [1:45:04]
我上来吧 ， 我好累 。

**吴涛** [1:45:06]
我说 。

**Rio** [1:45:07]
哈哈哈 。 为什么在这个时候叫我过 ， 甩给我 ？

**吴涛** [1:45:12]
因为我把该砍的人都砍掉了 ， 剩下都是该你讲 ， 讲这个很 ， 很完美的世界了嘛 。

**Rio** [1:45:17]
嗯 ， 天 ， 好吧 ，UTF-8 是一个目前看来比较完美的编码方案 。

**吴涛** [1:45:24]
The holy grail of encoding。

**Rio** [1:45:27]
可以这么 ， 可以这么说吧 ， 就是虽然它还是带有一些美国重心主义的色彩 ，但是 ， 呃 ， 基本上已经在占地和效率方面达到一个均衡 。

啊 ，UTF-8 虽然叫 UTF-8，但是它是 ， 它是一种所谓的 ， 呃 ，variable length， 就是可变长度的字符编码 。 就是说一个字 ， 或者说一个符号 ， 比如说我们常 ， 常见的这些 emoji 之类的 ， 呃 ，有可能用一个字符 ， 一个 byte， 就是 8 个 bit， 或者 ， 呃 ， 最多可以用到 6 个 ， 目前是 6 个吧 ，6 个 byte，以前是 4 个 。

啊 ， 现 ， 现在是 6 个 ， 最多可以用到 6 个字节 ， 就是 68，48 个 bit 来代表一个符号 。 然后其中最原始的那 128 个 ASCII 的字符 ， 这些就 ， 就和 ASCII 一模一样 ， 就是只需要一个字节 。

也就是说一个 UTF-8 的 ， 呃 ， 文件如果它只用那个 ASCII 字符来写的话 ， 它和 ASCII 编码的那个 ， 呃 ， 文件是一模一样的 。

然后带有附加符号的什么 ， 就比如说德语的 ü 啊 ， 然后什么阿拉伯语啊 ， 呃 ， 俄罗斯用的那个叫什么西里尔字母啊之类的 ， 就从 ， 从这些字母开始就全都需要两个字节编码了 。

然后中文则需要 3 到 4 个字节 ， 基本上大部分中文都是需要 3 个 ，3 到 ，3 到 4 个字节 ， 对 。 然后， 嗯 ， 就是在 ， 尤其是那个在 Unicode 里面所谓叫什么 BMP，BMP 的全称是什么 ？

**吴涛** [1:47:13]
Basic Multilingual Plane。

**Rio** [1:47:17]
对 ， 呃 ， 基本多语言平面的那个 plane， 就这个位面里面基本上全都在 ， 啊 ，3 个字节里面 。 所以汉字在 ， 和 ， 和用 ， 用它来编的话 ， 基本上全都是 3 个字节编码 。

呃 ，也就是说如果你用 UTF-8 来编一个之前是用 GB 2312 编的 ， 呃 ， 文件的话 ， 那它的 ， 呃 ， 尺寸可能会扩大 50%。

嗯 ， 这可能是它的唯一一个 ， 对 ， 对于中文使用者来说 ， 它是它唯一一个比较不好的地方了 。

**吴涛** [1:47:51]
但其实这个问题在现代都是用压缩技术的情况下， 完全没有任何区别 。

**Rio** [1:47:58]
对 ， 就是耗费的这些多余的空间 ，其实基本上只在网络传输和 ， 呃 ， 磁盘比较昂贵的时代有 ， 又是一个比较大的 drawback。

但是在目前带宽这样的话 ， 就大部分时候即便不压缩都 ， 都还好 ， 都还 OK 了 。

**吴涛** [1:48:15]
对 ， 你 ， 你看你一篇文本能值多少个 ， 你随便下个图不就没了是吧 ？

**Rio** [1:48:22]
对 。 然后， 呃 ，UTF-8 最开始好像是在 2000 年左右开始 ， 开始定义了嘛 ， 所以其应用也基本上就是 2000 年之后出的操作系统才开始比较大规模使用的 。

**吴涛** [1:48:37]
嗯 ， 应该不是 ，UTF-8 很早就有了 。

**Rio** [1:48:41]
不 ，UTF-8 在 ， 呃 ， 怎么说 ，有一个官方的定义文件应该是在 2000 年 。

**吴涛** [1:48:47]
啊 。

**Rio** [1:48:48]
就是它第一版的那个 ， 第一版的那个 ， 或者说最新修订版本应该是在 2000 年， 然后它最开始的起源可能是在 96 年， 就反正早了 45 年 。

**吴涛** [1:48:57]
93 年 。

**Rio** [1:48:57]
那也就 。 好吧 。

**吴涛** [1:48:59]
93 年 。

**Rio** [1:49:00]
它不是 ， 它其实不是一个特别老 ， 就特 ， 特别古老的那个编码 ， 或者说它是一个相对来说比较新的编码用方式 。

然后， 呃 ， 目前来讲应用还不是特别的广泛 ，但是我们所希望达到理想国的状态就是全世界就只用 UTF-8 这样一种编码 。

哎 ， 刚才说到 Windows，Windows 内部是不是用 UTF-8 的 ， 对吧 ？

**吴涛** [1:49:25]
嗯 。

**Rio** [1:49:25]
是用那个 。

**吴涛** [1:49:26]
没 ， 没有系统内部会用 UTF-8 的 ，因为它是变长的 ， 变长是很不利于处理的 。

**Rio** [1:49:31]
啊 ，OK。

**吴涛** [1:49:32]
对 ， 所以其实 UTF-8 它的最大优势是在于这个不同的 ， 就是什么跨平台的 ， 或者说可交换的这样一个场景 。

**Rio** [1:49:40]
就 ， 就我们说到 UTF-8 或者 UTF-16 的时候 ，其实 ， 啊 ，在现实中 。

**吴涛** [1:49:46]
强调的都是兼容性 。

**Rio** [1:49:47]
都是在它存到磁盘上， 就 ， 就序列化之后的一个结果了 。

**吴涛** [1:49:52]
嗯 。

**Rio** [1:49:54]
互联网工程工作小组要求所有的互联网协议都必须支持 UTF-8。

**吴涛** [1:49:59]
对 ， 就是唯一的这个全球认可的一个标准嘛 。

**Rio** [1:50:04]
然后互联网邮件联盟是建议所有的电子邮件的软件都支持 UTF-8。

**吴涛** [1:50:10]
但这个有点困难 。

**Rio** [1:50:11]
是 ， 对 。 邮件的话还很复杂 。

**吴涛** [1:50:16]
对 。

**Rio** [1:50:16]
对 。 呃 ， 然后 UTF-8 的编码方式其实也比较好理解 ，因为 8 比特的那个第一个位如果是 0 的话 ， 那它就是肯定是 ASCII 的那个编码了 。

然后如果你怎么辨认说接下来两个比特是一个双比特的 UTF-8 的字符呢 ？ 就是看第一个比 ， 第一个 byte 的 ，sorry， 我刚才应该说字节 ， 就如果你怎么 ， 你怎样才能认识 ， 辨认出接下来两个字节是一个双字节的 UTF-8 的 ， 呃 ， 编码呢 ？

就是要看第一个字节的前两位如果是 1， 然后第三位是 0 的话 ， 那就意 ， 这意味着这是一个 ， 啊 ， 双字节的 UTF 码 。

如果有三个 1 然后一个 0 的话 ， 那也就意味着它是一个三字节的 UTF 码 。 然后除了第一位之外 ，其他的后面的几个字节 ， 每个字节的前两位都是 10。

呃 ， 对 ， 然后这样到如果你用 ， 如果你有 6 个字节来表示一个 ， 呃 ， 码位的话 ， 那它就是 11111，6 个 1， 然后接一个 0。

对 ， 然后， 呃 ， 就可以把接下来的剩下的 5 个 byte 也都以 10 开头跟在它后面 ， 然后来代表一个字符 。

差不多就这样吧 。

**吴涛** [1:51:31]
是 。

**Rio** [1:51:32]
还有什么要介绍的 ？

**吴涛** [1:51:33]
所以就是撑死 UTF-8 是 6 个字节为一个东西 ， 为一个 ， 呃 ，code。

**Rio** [1:51:41]
对 。

**吴涛** [1:51:41]
OK。

**Rio** [1:51:43]
这个倒不一定 。

**吴涛** [1:51:44]
它的这个倒不一定 。

**Rio** [1:51:46]
不能再扩了嘛 。

**吴涛** [1:51:47]
What？

**Rio** [1:51:47]
呃 ， 就是说你可能不能用这一套 。

**吴涛** [1:51:50]
第一位完全是 7 个 1 一个 0 是吧 ？

**Rio** [1:51:52]
就是说你不 ， 你可能不能在这种方式上继续扩展它的这个字符的这个量了吧 ？ 但是你还可以用一些别的方式 ， 比如你可以通过中间串一个什么特殊的字符来告诉 。

**吴涛** [1:52:07]
它 ， 它 ， 它这样设计是有 ，有目的的 ， 就是说这么设计它最后有一个 ，有一个很重要的特性要 ， 要 ， 要解释一下 ，不然的话就很容易乱掉 。

**Rio** [1:52:16]
嗯哼 。

**吴涛** [1:52:17]
就是说因为变 ， 变长和 ， 就为什么刚才讲那个操作系统内部执行的时候都一定是用定长的 ， 定长它如果做那个叫什么跳转啊 ， 计算 offset， 就是那个位移的话 ， 它是很简单的 。

**Rio** [1:52:29]
啊 ， 它是乘以整数就可以了 。

**吴涛** [1:52:30]
没错 ， 没错 。 但是变长的话就不具备这个问题了 。 变长的话要 ， 要避免的一个很大的问题就是说在一个相当长的文本里面 ， 假设部分字符出现问题 ， 可能是因为磁盘存储的介质的损坏 ， 或者是网络传输的问题 ， 导致中间部分那个字节发生变化的时候 ， 我们能够很快地辨认出来那部分哪部分是坏的 ，并且在那个坏的那个字节或者那几个字节

之后， 立即重新地找回你的那个起点 ， 就是你怎么 ，因为是变长 ， 你不知道接下来的那个 ， 那个 ， 那个字符的起点在哪里嘛 。

**Rio** [1:53:05]
就中间几 ， 几个码坏掉后面的字全乱了 。

**吴涛** [1:53:08]
对 ， 所以说这个是一种很危险的 ， 就是很 ， 很不健壮的一种 ， 一种设计嘛 。 所以但是 UTF-8 这种设计它可以导致说它就你能够很快地叫做 self-synchronizing， 就是可以自己同步 ，因为你只用看每一个字节 ，因为你自旋搜索就是每个字节 ， 每个字节的这样去跳嘛 。

你只要看每个字节的前两位 ， 你就能够知道它这个是不是某一个 ， 呃 ， 这个一个 ， 这个字 ， 字 ， 就 character 的起点 。

因为如果它是 10 开头的话 ， 或者是 0 几开头的话 ， 它肯定不是 ， 它肯定 ， 肯定 ， 比如它是第一位是 0 的话 ， 它肯定是一个单一字节 ， 它就是一个字符的起点 ， 对吧 ？

然后如果它是 10 开头的话 ， 它肯定不是 ， 它是前面一个字符的一部分 。

**Rio** [1:53:48]
对 。

**吴涛** [1:53:49]
对 ， 所以它 。

**Rio** [1:53:49]
就可以跳过去 。

**吴涛** [1:53:50]
对 ， 就可以直接 ， 直接 skip， 直 ， 直到你又发现一个第一位是 0， 或者 ， 或者是 1111 这种开头的 ， 就根据那个前缀那个表嘛 。

所以这个是一个很重要的特性 。 如果说一旦这个结构被破坏的话 ， 这个 UTF-8 的健壮性就不复存在了 。

**Rio** [1:54:07]
啊 ， 对 ，在编码方案的这个层面确实是这样 。 对 ， 我刚刚想说的意思就是说其实我们可能不必担心 ， 呃 ， 用 UTF-8 这种编码方案会导致有一天说我们想用的字符数不够用 。

**吴涛** [1:54:20]
对 。

**Rio** [1:54:21]
对 ， 它其实可以 ， 可以添加别的方案进去 ， 将这个范围扩得更广 。

**吴涛** [1:54:26]
对 ， 就反正其实起码到目前为止 ，6 个字节的这个非标的也已经就足够用了吧 。

**Rio** [1:54:32]
对 ， 对 。

**吴涛** [1:54:33]
希望我们不要再往这个 Unicode 垃圾堆里面再塞东西了 。

**Rio** [1:54:37]
哈哈 。 可是 Unicode 这个垃圾堆还一直都在 。

**吴涛** [1:54:41]
对啊 ，而且它现在有一个非常重大的缺口 ， 理论上可以无限塞 ， 就是那个 emoji 的这个缺口 。

**Rio** [1:54:47]
哈哈哈 。

**吴涛** [1:54:50]
表情文字 。

### Emoji

**Rio** [1:54:50]
那 ， 那个 ， 那个坑我们是这次讲还是下次讲 ？

**吴涛** [1:54:54]
我们可以专门找一期专门来讲这个 。

**Rio** [1:54:56]
另外我们可以专门找一期来讲各种各样有趣的英文 。

**吴涛** [1:54:59]
OK， 就是说 。

**Rio** [1:55:00]
以及有 ，以及有一些根本就不知道为什么要放在那的英文 ， 就是英文这里面有一个 ， 一个悬浮在半空中的男人， 对吧 ？

这个 emoji 到底有什么意义 ？

**吴涛** [1:55:10]
哈哈哈 。 对 ，但就是说这个是一个就象形文字始终是要解决的问题嘛 ， 就是 ， 就是 ， 呃 。

**Rio** [1:55:20]
它是 ，是不是一个封闭的集合 ？

**吴涛** [1:55:22]
对 ， 对 ， 这你 ， 你 ， 你很 ， 就很麻烦 ， 你说不清楚 。 比如说你刚才吴涛问那个问题 ， 一个漂浮在半空中的男人表达了这么一个象形文字 emoji， 它和我们考古挖出一个故纸 ， 这里面写了一个通假字有什么区别 ？

**Rio** [1:55:36]
通假字至少有意义啊 。

**吴涛** [1:55:38]
它写错了吗 ？ 它写错了就有意义 ， 我们要表达 ， 现代人要表达一个东西就没有意义呢 ？ 就我觉得这种 ， 这种就是你去考它 。

**Rio** [1:55:46]
这是个政治问题 。

**吴涛** [1:55:47]
对 ， 你去考它的这个 semantics。

**Rio** [1:55:49]
不是 ， 通假字你至少知道它有意义 ，但是这个 ， 至 ， 至少你可以推测出来它代表的意义是什么 。 可是这个悬浮在空中的男人这个意义是什么 ， 都很多人不知道的 。

**吴涛** [1:56:01]
我也不知道 ， 你也得解释一下 。

**Rio** [1:56:03]
不是 ， 这个意义 ， 这个符号最开始是出现在 ， 呃 ， 微软的 webdings 里面 。

**吴涛** [1:56:11]
嗯哼 。

**Rio** [1:56:12]
然后， 呃 ， 是一个 。

**吴涛** [1:56:16]
码位多少啊 ？

**Rio** [1:56:17]
我稍 ， 稍等我找一找 。

**吴涛** [1:56:20]
切 ， 你怎么搜 ， 悬浮在半空中的男人吗 ？

**Rio** [1:56:24]
哈哈哈 。

**吴涛** [1:56:24]
Levitating man emoji。 对 ，man in business suit levitating。 就搜 ， 搜这个 。U1 加 5，1 加 ，不 ，U 加 1F574。

**Rio** [1:56:37]
浮在地面上的四桩男 。

**吴涛** [1:56:40]
哈哈哈 。

**Rio** [1:56:41]
对 ， 这是什么鬼 ？

**吴涛** [1:56:43]
这个 ， 这个 emoji 最开始是出现在 webding 里面 ， 然后它的意义是一个感叹号 ， 然后这个感叹号的风格就像一个 rude boy logo， 然后是在 ， 呃 ， 是一个叫做 The Specials 的乐队所 ， 所 ， 所出 ， 出的一张照片里面 。

**Rio** [1:57:04]
是念 emoji 还是 emoji？

**吴涛** [1:57:06]
Emoji。

**Rio** [1:57:07]
你要是按日文念读音的话就是 emoji。

**吴涛** [1:57:11]
Emoji。

**Rio** [1:57:12]
对 ，emoji。

**吴涛** [1:57:13]
Emoji，OK。

**Rio** [1:57:14]
啊 ， 这么说它确实有点像一个感叹号 ，因为就是它的那个人悬浮在空中， 地下有个投影 ， 正好是感叹号的那一点 。

**吴涛** [1:57:21]
哈哈哈

。 嗯 ， 好吧 。

**Rio** [1:57:27]
这什么鬼 ？

**吴涛** [1:57:28]
对 ， 这个玩意在 Unicode 1.0， 呃 ，7.0 的时候进入了 Unicode。

**Rio** [1:57:33]
所以吴涛在这个 emoji 这个 ， 这个争论里面是持这个保守派的 。

**吴涛** [1:57:40]
什么叫保守派 ？ 左派和右派的区别是什么 ？ 右派是应该 。

**Rio** [1:57:44]
就是 Unicode 那个工作组里面就说我们不要加那么多乱七八糟的东西进来了 。

**吴涛** [1:57:49]
这个是我觉得界 ， 界限是很难界定的嘛 。 你 ， 你怎么区分什么叫乱七八糟的 ？

**Rio** [1:57:54]
不 ， 就是我就觉得这个就是象形文字不封闭的导致的一个必然结果嘛 。

**吴涛** [1:57:58]
对 ，但主要就是它不是一个封闭的集合嘛 ， 退一万步 ， 嗯 ， 本质上来讲 。

**Rio** [1:58:03]
对啊 ， 你这个边界随时都在扩的 ， 就很麻烦 。 对 ， 所以这个东西是一个深坑 ， 没有 ， 没有办法 。 就是如果说这个 Unicode 里面那帮人觉得不应该加 emoji 进来的话 ， 那也不要从故纸堆里面找那个生僻字进来了 ， 是一个原理嘛 。

**吴涛** [1:58:18]
嗯 ， 对 ， 事实上将这个 emoji 当成一种字符 ， 这个观念本身就是一个比较激进的观念了 。 它本身不是一种文字 。

**Rio** [1:58:29]
但是从技术上的实现来讲的话倒是 OK 的 ，因为你从 font 的技术上实现来讲 ， 我就是一个码 ， 然后显 ， 显示一个 glyph 嘛 ，glyph 其实就是一个图案嘛 ， 对吧 ？

嗯 ， 从技术显示来讲这是很正常的 。

**吴涛** [1:58:43]
嗯哼 ， 它是一个典型由技术来推动标准 ， 就由技术实作来推动这个标准改变的这样一个问题了 。

**Rio** [1:58:52]
好吧 ，emoji 咱们还是下次再说吧 。

**吴涛** [1:58:54]
好 ， 对 ， 对 ， 对 ， 没错 。 而且我觉得就是它还推出来一个扩展 ， 就是 ， 呃 ， 一个三维的符号应不应该算作一个 emoji？

**Rio** [1:59:07]
哈哈哈 ， 一个三维的符号是什么意思 ？

**吴涛** [1:59:09]
就是同样一个 ，有一个平面的脸和一个立体的脸 ， 它算一个符号吗 ？

**Rio** [1:59:15]
啊 ， 啊 ， 啊 。

**吴涛** [1:59:16]
这 ， 这就刚才我们说的那个 who 的三种写法 ， 它算一个还是算三个呢 ？

**Rio** [1:59:21]
对 ， 没错 。

**吴涛** [1:59:23]
就 ， 就很难去划分这个东西 。 所以我觉得不把那个到底是表音 、 表意还是表形这个东西定下来 ， 这个东西永远都是有争议的 。

**Rio** [1:59:32]
嗯 。

**吴涛** [1:59:33]
啊 ， 好吧 ， 那 ， 那要不刹个车 ， 然后我们下次接着讲 。

**Rio** [1:59:38]
OK， 所以我们今天究竟有没有讲到乱码这件事情 ？

**吴涛** [1:59:42]
我大概还是 。

**Rio** [1:59:43]
算是讲了吧 。

**吴涛** [1:59:43]
大概还是讲到了 ， 对 。

**Rio** [1:59:45]
嗯哼 。

**吴涛** [1:59:46]
嗯 ， 就是说我们讲到了这个一些编码的基本的原理 ， 然后梳理了一下这个字符集规范的这个发展的历史 。

那么在这两个环节中， 如果有一个环节出错了 ，其实首先就会导致乱码 ， 然后最后我们还讲了这个字节端序的问题 ， 它也是导致乱码的一个实践中经常遇到的因素的 。

**Rio** [2:00:09]
嗯哼 。

**吴涛** [2:00:10]
嗯 。

**Rio** [2:00:12]
其实大家要珍惜每天你在网页上看出来的这些字符 ，因为它突 ， 突破千辛万险被正确地编译出来 ， 呃 ， 编码编出来 ， 然后传输过来 ， 然后显示在你的浏览器里面 。

对 ， 它已经经过了各层的处理 。

**吴涛** [2:00:30]
不过实际上那个我们应该知道就是说 ， 呃 ， 像 HTML 它的这个解析规则里 ， 它的这个健壮性还是比较强的 ， 它应该能容一定的编码错误 ， 对吧 ？

**Rio** [2:00:42]
嗯 ，是的 。 那当然了 ， 要不然的话 ， 你想在传输过程中又是掉包 ， 又是乱 ， 又顺序又会乱的 ， 对吧 ？

各种各样的 。

**吴涛** [2:00:51]
啊 ， 我指的是就是比如说那个我这个浏览器把它误认成另一种与它不符合的编码 ，其实在不少情况下， 就因为大家都对 ASCII 的兼容比较好嘛 ， 那么 HTML 用到一些关键的这个标记符号都是 ASCII 里面的 ， 所以它其实还是可以正确地渲染一部分的 。

**Rio** [2:01:11]
嗯 ， 就至少它那个 mark 是对的 。

**吴涛** [2:01:16]
嗯 。

**Rio** [2:01:17]
好吧 ， 那今天时间有限 ， 那就暂时先刹到这边 ， 我们下次再接着讲 。

**吴涛** [2:01:24]
好 。

**Rio** [2:01:26]
感谢大家的收听 ， 那大家可以从各种社交网络上关注我们 。 那 《 字谈字串 》 呢 ，在新浪微博 、 微信公众号以及推特的账号呢 ， 名字都是 TheTypes， 呃 ，T-H-E-T-Y-P-E。在 Facebook 上面呢 ， 可以通过 Typist Beautiful 找到我们 。

那也欢迎大家用邮件的方式来给我们写反馈 ， 我们的邮箱是 podcast@thetype.com，podcast 的拼写是 P-O-D-C-A-S-T，the type 的拼写是 T-H-E-T-Y-P-E，podcast@the type.com。 欢迎大家给我们捐款 ， 让我们努力把节目做成最好的 、 全球最好的字体播客 。

**吴涛** [2:02:04]
呃 ， 感谢收听 IPN Podcast 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。 我们号称 hardcore，但是也没有干货 。 想听人听 ，不想听人就别听 。

您可以为本节目捐款 ， 地址是 cardinalpanic.fm/donate。 捐款金额随意 ， 只要是 8 的正整数倍就可以 。 捐款不会给你带来什么 ，不捐也不会让你失去什么 。

我们的口号是 "No Hard Feelings"。 如果您有任何反馈 ， 可以发邮件到 cardinalpanic@ipn.li。 同时也欢迎您收听 Rio 主持的 《 疯头圈 》 以及 IPN 旗下的其他几档节目 ：《 未知道 》、《 太一来了 》、《 流星通信 》、《High Story》、《 映影像 》、《 无词缘 》、《 薄雾至 》、《 选美 》、《 陛下官 》、《 一天世界 》、《 时尚怪物 》。

我们下期节目再会 。

**Rio** [2:02:45]
拜拜 。

**吴涛** [2:02:46]
拜拜

。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
