# 46. Kerning Panic·字谈字串（四）峰回路转换行来↵

内核恐慌 · 2017-04-04

<https://lib.pan.icu/374c19b6-0bb8-4287-8917-5607021127bf>

本期《内核恐慌》与《自弹自唱》串台，主题聚焦计算机换行符（carriage return, line feed, CRLF）的历史与差异。节目从打字机时代讲起，解释回车（CR）是让字车回到行首，换行（LF）是向下移动一行，两者本为独立动作。现代系统中，Unix/Linux使用LF换行，Windows使用CR+LF，经典Mac OS使用CR，而OS X之后改用LF。主持人还探讨了软回车（强制换行）与硬回车（段落结束）在排版中的区别，以及Notepad等编辑器对换行符处理的奇葩行为。此外，节目延续了上一期关于Emoji的讨论，涉及Unicode规范、平台差异及文化视角，并穿插了Git换行符配置、FTP传输模式等程序员日常话题。

## Questions this episode answers

### 为什么不同操作系统用不同的换行符（如 LF 和 CRLF）？

吴涛和 Rio 解释，早期打字机和电传打字机将“回车”（CR）和“换行”（LF）作为两个独立操作，因为机械动作需要时间，且通常先发 CR 再发 LF 以加快完成。后来计算机系统沿袭这些控制符：Unix（含 macOS）只用 LF，Windows 用 CR+LF 组合，老款 Mac OS 只用 CR。网络协议如 HTTP 也规定使用 CRLF。这种差异源于历史机械限制，导致跨平台纯文本文件的兼容性问题。

[37:01](https://lib.pan.icu/374c19b6-0bb8-4287-8917-5607021127bf?t=2221000)

### 在文字处理中，软回车和硬回车有什么区别？

吴涛和 Rio 指出，硬回车（直接按回车键）产生新段落，插入分段符，会影响段间距；软回车（Shift+Enter）仅强制换行而不创建新段落，常用于诗歌或地址等需要换行但保持同一段落样式的情形。在 HTML 中，分别对应 <p> 与 <br> 标签。软回车换行后的文本仍被视为同一段落，不受段落间距影响。

[1:08:12](https://lib.pan.icu/374c19b6-0bb8-4287-8917-5607021127bf?t=4092000)

### 分段符号 pilcrow（¶）的历史由来是什么？

吴涛和 Rio 讨论道，pilcrow（¶）源自中世纪手稿，用于在段落间标记新段，通常用红色书写以区别于正文。在活字印刷早期，由于套印红色费时，排版工人常留空位，后来逐渐用缩进或空行取代，但 pilcrow 作为控制符仍保留在现代文字处理软件中。

[1:14:05](https://lib.pan.icu/374c19b6-0bb8-4287-8917-5607021127bf?t=4445000)

## Key moments

- **[0:00] 开场**
  - [2:49] 2007年4月4日，Type is Beautiful站长Rex发布第一篇文章，仅有一句话且五年无更新线索
- **[4:06] 听众来信**
  - [7:14] Rio误将‘舒服’表情用作心照不宣，实际词义关联导致聊天尴尬
  - [11:09] 青少年用Emoji中的黑色月亮脸代表黑人问号脸
  - [12:09] 语言学视角：Emoji作为能指，其指向的所指是社会约定的心理表象，而非实物
  - [13:06] Rio预测：不依赖语言的脑机直接通信将是下一次通信革命，可大幅提升教育效率
- **[15:09] 机器学习**
  - [15:09] 机器学习风格转移技术可用于生成新字体，如基于五万种字体训练的深度神经网络
  - [19:05] 在G公司设计Android Emoji的听众来信，分享中国Emoji使用率低因微信表情包流行
  - [22:39] Android O将推出新版Emoji，包含吸血鬼、僵尸以及部分中国元素如饺子和筷子
- **[26:34] 贴纸大战**
  - [27:27] Rio与吴涛辩论：Rio认为Emoji不应由Unicode负责，用贴纸即可；吴涛认为Unicode目的并非满足表情需求
  - [29:12] 吴涛调侃：‘张学友的‘你吃屎啦’表情说不定20年后会变成Unicode的一部分’
  - [31:15] Rio指出新Emoji的中国元素如 fortune cookie 和 takeout box 是美国人提案的东方主义刻板印象
  - [34:36] Eric指出新Emoji提案是先有概念后有图像，与原始Emoji先使用后稳定的形成过程颠倒
- **[36:49] 换行溯源**
  - [37:11] 打字机时代，回车的动作是手动将字车推回行首，与换行分开
  - [44:39] Mac键盘上主键盘return用于换行，数字键盘enter用于确认输入，在Photoshop中行为不同
  - [52:14] 不同操作系统使用不同换行符：Unix用LF，Windows用CR+LF，旧Mac OS用CR
- **[53:14] 平台差异**
  - [55:44] HTTP规范要求CRLF作为换行，但建议接收方只要看到LF就换行，以兼容不规范客户端
  - [58:46] 在终端中使用回车符\r可以回到行首重绘，制作简易进度条，无需换行
  - [1:07:03] C语言以空字符终止字符串的设计是糟糕的，常导致缓冲区溢出，现代语言已改进
- **[1:07:48] 软硬回车**
  - [1:08:07] 硬回车（Enter）创建新段落，软回车（Shift+Enter）强制换行但不分段，影响段落间距
  - [1:12:05] 中世纪的pilcrow符号用于在羊皮纸上分段以节省空间，后来逐渐被缩进替代
- **[1:18:16] 编程之困**
  - [1:21:06] Windows记事本在自动换行时会在内存中插入CRCRLF控制符，导致跨编辑器换行混乱
- **[1:25:53] 编辑器**
  - [1:26:08] Rio说：‘刚用Mac的时候我想，为什么我只想写点东西，却让我调整字号，这何必呢？’
  - [1:29:09] 江疆开发了TextEdit+，为Mac文本编辑器增加编码识别、BOM处理，并修复中英输入光标跳动问题
  - [1:31:42] 经典Mac OS采用CR换行，Mac OS X改为LF，导致跨版本文件换行符不兼容
- **[1:32:18] 网络协议**
  - [1:33:33] FTP的ASCII模式仅支持7位字符，为了兼容古老电报系统，现代邮件附件编码仍保留7位转换开销
  - [1:35:22] Rio建议避免使用FTP协议，因其不安全且混乱，应使用基于SSH的SFTP或SCP
- **[1:38:37] 尾声**

## Speakers

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

## Topics

字符编码, 排版, 操作系统

## Mentioned

Unicode (company), Android (product), CotEditor (product), DOS (product), Mac OS (product), Mac OS X (product), Notepad++ (product), Photoshop (product), Sublime (product), TextEdit (product), TextEdit+ (product), Type is Beautiful (product), Unix (product), Vim (product), Windows (product), iOS (product), line (product), 小狼毫 (product), 微信 (product), 记事本 (product)

## Transcript

### 开场

**吴涛** [0:01]
呃 ， 你们 《 内核恐慌 》 是第几期啊 ？

**Rio** [0:04]
哎 。

**吴涛** [0:04]
好问题 。

**Rio** [0:05]
哈哈 ，45 吧 ， 应该是 。

**吴涛** [0:07]
查一下网站 。

**Rio** [0:08]
反正 。

**吴涛** [0:09]
应该是 45。

**Rio** [0:10]
应该是 46。

**吴涛** [0:12]
45。

**Rio** [0:13]
45。

**吴涛** [0:13]
46。

**Rio** [0:14]
感受 。

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

**Rio** [0:16]
OK。 哦对 ，因为加上这一期的话是 。

**吴涛** [0:19]
对啊 ， 我们快赶上你们了 。

**Rio** [0:22]
What？ 刚才是刚才谁说了一句什么 ？

**吴涛** [0:25]
我们节目快要赶上你们了 。

**Rio** [0:27]
就 ， 哦 ，OK。 我在 ， 哎 ， 我也在 wonder 为什么要欢呼一下 。

**吴涛** [0:32]
对啊 ，因为当时你还在节目里耻笑说 ， 哼 ， 当时还没你们呢 。

**Rio** [0:36]
哦 。

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

**Rio** [0:38]
那不是 ， 你说过这句话吧 ？

**吴涛** [0:40]
这有什么的 ， 那 Firefox 也可以说 ，也可以永远对 Chrome 说 ： 别看你们版本号比我们高 ，但是当时我出来的时候还没你们呢 。

**Rio** [0:49]
哈哈哈

。

**吴涛** [1:11]
大家好 ， 今天是 4 月 4 号 ， 自弹自唱的第 44 期 。

**Rio** [1:15]
这故意的吧 ？

**吴涛** [1:17]
哎 ，不是 ， 就 ， 哎 ， 就刚好 。 我们只是刚好每隔 ， 哦 ， 周二更新嘛 ， 就刚好这期 4 月 4 号第 44 期 。

不是故意的 ， 恰好的 。

**Rio** [1:25]
好吧 ， 同时也是 《 内核恐慌 》 第 46 期 。

**吴涛** [1:28]
那而且这次是自弹自唱与 《 内核恐慌 》 串台的第 4 期 ， 还有我们今天 。

**Rio** [1:34]
哎 ， 播客 4 啊 ，不是 ， 好像也不太吉利 ， 对不对 ， 中国的话说 。

**吴涛** [1:38]
自弹自唱是全球首家用华语制作的字体排印主题播客节目 。 我是主播 ， 文川西班牙东营区 Eric。

**Rio** [1:45]
我是主播 ， 黄浦江边新真鱼 ， 钱真鱼 。

**吴涛** [1:49]
呃 ，《 内核恐慌 》 是 IPN Podcast 网络旗下的 IT 技术与娱乐节目 ， 号称 hardcore，但是也没有干货 。 想听人听 ，不想听人就别听 。

我是吴涛 。

**Rio** [2:00]
我是 Rio。

**吴涛** [2:01]
哈哈哈 。 为什么要延迟这么久 ？

**Rio** [2:03]
有点拖线 。

**吴涛** [2:05]
哈哈哈 。 我在看念到哪了 。

**Rio** [2:07]
OK。

**吴涛** [2:07]
哎 ， 对 ， 你你你 。

**Rio** [2:09]
我有一回去一个很高的那种大楼嘛 ， 它要做那个电梯 ， 对吧 ？

**吴涛** [2:14]
嗯哼 ， 嗯 。

**Rio** [2:15]
然后它说要做到多少多少 ， 比如说 ， 比如说 80 几层吧 ， 可能 70 几层这样 。 但后来我数下去 ， 这个楼好像没有那么多层 。

然后后来我仔细看 ， 电梯上没有 ， 就是没有 44、24、34， 就所有以 4 结尾的 ， 或者是含 4 的楼层 。 然后没有 13。

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

**Rio** [2:33]
嗯 ， 对啊 。

**吴涛** [2:34]
很多居民楼都是这样的 。

**Rio** [2:36]
对 ， 然后就会觉得 ， 那你要这个编号干什么 ？

**吴涛** [2:39]
但总得有个编号啊 。

**Rio** [2:42]
咱们是不信邪的 ， 就是故意要踩着这个点 。 你看 ， 我们能把凑齐的都凑齐了今天 。

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

**Rio** [2:49]
而且而且 ， 今天就是 4 月 4 号 ，其实是一个非常重要的日子 。 呃 ，在 2007 年的 4 月 4 号 ， 呃 ， 本站站长 ， 或者说贵站 ，不对 ， 我站站长 Rex。

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

**Rio** [3:04]
又发生了站位问题 。

**吴涛** [3:06]
我站站长 Rex 在 Types Builder 上发布了第一篇文章 。

**Rio** [3:12]
啊 ， 此处应该有掌声 。

**吴涛** [3:13]
对 。 而且 ， 哈哈哈 ， 就如果你现在去翻那个 Types Builder 的话 ， 第一篇文章是什么 ， 谈 Helvetica 和 Ariel。 但是 ， 呃 ， 真正意义上的第一篇文章 ，其实是一篇叫做 Hell 的短文 ， 然后里面只有一句话 ， 什么 ， 呃 "This is a weblog about Chinese and English typography.

I'm not sure. I haven't have a clue about what to write here." 之类的 ， 就只有这么一句话 。 然后这个第一篇文章在网站上挂了大概 5 年 。

它一直都没有 clue。

**Rio** [3:48]
哈哈哈 。

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

**Rio** [3:50]
哎 ， 现在还翻得到那篇文章吗 ？ 就是 。

**吴涛** [3:53]
现在你去后台草稿里面看的话 ， 还有 。

**Rio** [3:56]
啊 ， 对 ， 后台有啊 。 翻出来多不好 。

**吴涛** [3:59]
这个就是 ， 这就是历史的故纸堆啊 。

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

**吴涛** [4:03]
对啊 。

**Rio** [4:03]
所以今天是个很重要的日子 。

**吴涛** [4:06]
好吧 。 呃 ，不过呢 ， 你们 《 内核恐慌 》 也被催更催得不行了哈 ，在那个群里面 ， 大家你们都不更新 。

### 听众来信

**Rio** [4:14]
我什么 Twitter 啊 ， 知乎啊 ， 全都有人催更 ， 我受不了 。

**吴涛** [4:18]
对啊 。 然后没有办法 ， 我不得不说 ，有我在 ， 肯定会更新的 ， 把你们拖进来 ， 拖出来更新 。

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

**吴涛** [4:28]
你看 ， 对啊 ， 上一次咱们做那个 ， 呃 ， 上期节目就是串台嘛 ，而且上一期是都几月份的事情了 ， 我看一下哈 ， 应该是 2016 年的 11 月份 ， 咱们第三次串台讲的是那个 Emoji 嘛 。

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

**吴涛** [4:42]
对吧 ？

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

**吴涛** [4:43]
来 ， 好评如潮啊 。 据说好像我们这边有很多反馈 ， 真鱼是不是和大家说一下 ？

**Rio** [4:49]
啊 ， 首先是在我们的这个 TIB 的这个文章的帖子下面 ， 然后有一条留言 ， 就是给我们分享了一个视频 。

然后刚不小心打开这个视频 ， 这个视频的进场的那个曲子非常恐怖 ， 感觉啊 。

**吴涛** [5:03]
恐怖 ？

**Rio** [5:04]
他说 。

**吴涛** [5:05]
对 ， 就是那个有一段非常奇怪的噪音 ，不知道是什么 。

**Rio** [5:09]
OK。

**吴涛** [5:10]
呃 ，不好意思 ， 今天有点咳 。 啊 ， 这位叫一帆的这位听众 ，他说本期节目配合 Mariko 小姐的演讲使用 ， 风味更佳 。他应该是给我们分享了一个有关 Emoji 的一个演讲 ， 好像是三星主办的某一个什么会议上的 。

嗯 ， 然后他给了一个 YouTube 的一个链接 ， 大家有兴趣的话可以看一下， 我们也会把这个链接放出来给大家 。 然后另外就是 ， 我们那期其实说到了一些关于这个 Emoji 输入法的问题啊 ， 这个好像有挺多听众给我们反馈的 。

有一位听众说 ， 小狼毫输入法可以输入 Emoji， 你们有人用过这个吗 ？ 小狼毫应该是那个中州韵的 Windows 版是吧 ？

**Rio** [5:57]
对 。

**吴涛** [5:59]
对 ， 我只用过它的 Mac 版 ，但我不知道 Windows 版是一个什么状况 。他说可以输入 Emoji。

**Rio** [6:08]
怎么输呢 ？

**吴涛** [6:09]
嗯哼 ， 我不知道 。

**Rio** [6:10]
怎么输入呢 ？

**吴涛** [6:12]
他没有 ，他没有写具体怎么输入 ， 反正 。

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

**吴涛** [6:15]
但是输入总是可以输入的嘛 ， 就像我们现在连那个 Mac 自带的那个拼音输入法 ， 它也是可以输入的嘛 。

**Rio** [6:21]
我觉得 Mac 上面输入 Emoji 好像不是一个 ， 呃 ， 就不需要输入法来 ， 就特别某个输入法来支持 。

**吴涛** [6:30]
自动就好了嘛 。

**Rio** [6:32]
就是说用那个字符面板来挑是吗 ？

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

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

**吴涛** [6:35]
嗯 ， 可以去挑 。 然后呢 ，也可以就是你现在无论是默认的日文输入法还是中文输入那个拼音输入法 ， 你只要有拼音嘛 ， 你打香蕉到后面它的备选出来汉字以外 ，也会有那个 Emoji 出来 ， 这个都可以的 。

**Rio** [6:50]
嗯 ， 这现在缺的就是一个这个 ， 就是对应关系嘛 ， 就打哪几个字会出哪个这个 Emoji 的符号 。

**吴涛** [6:58]
嗯 ， 后面那个笨乌不飞那位听众 ，他也跟我们说话 。 嗨 ，Eric， 你好 。 某期节目听你们讨论 Emoji 输入法 ， 我觉得目前苹果处理得甚好啊 。在 iPhone 拼音输入 ， 如果某词汇相关联的 Emoji 就会在候选词里显示出来 。

不然 ， 啊 ， 当然不用专门做个 Emoji 输入法 ， 这个太反人类了 。 不过 Emoji 这个趋势 ， 就是要重新发明象形文字的架势啊 。

**Rio** [7:28]
对啊 。

**吴涛** [7:28]
呃 ，Mac 上面 。

**Rio** [7:29]
不过这个也不太全啊 。

**吴涛** [7:31]
iPhone 上面那个 Emoji 输入法好像是 ， 如果你输入了一行字 ， 比如说 ， 呃 ， 太阳 、 月亮 、 星星 ， 然后你立刻切换到 Emoji 输入法 ， 啊 ， 现有已经输入的文字会变成橙色 ， 然后你按 ， 按那个橙色的部分 ， 就会出现对应的 Emoji， 好像是 。

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

**吴涛** [7:54]
你这个是在那个 iMessage， 就是那个信息里面 。

**Rio** [7:59]
啊 ， 对 ， 好像只能在 iMessage 里面是这样 。

**吴涛** [8:02]
哦 ， 我就说这不是一个系统输入法的功能 ，是 iMessage 定制的东西 。

**Rio** [8:06]
啊 ，OK，sorry。

**吴涛** [8:07]
嗯 ， 就是那个 Message 那个 App 里面的功能 ， 对 。

**Rio** [8:10]
对 ， 主要是就是现在那个拼音 ， 然后它联想出来给你提示 Emoji， 这个有个问题 ， 就是有些 Emoji 你不知道它对应的那个拼音的那个词汇是什么 。

比如说那个什么 ， 就是一家四口有一个小孩 ， 那个五个月的图像 ， 对吧 ？ 那个拼音是什么我不知道 。

**吴涛** [8:29]
有各种各样的家庭嘛 。

**Rio** [8:33]
对啊对啊 ， 就那几个怎么描述嘛 。

**吴涛** [8:35]
对 ，其实因为还有个问题 ， 就是 Emoji 有一种潮流 ， 就是要特意去误用它们 ， 就是不按照它的本意来使用 。

所以一般来说 ， 联想出来的都是一些陈腔滥调的 Emoji。

**Rio** [8:49]
对 ， 就比如说前两天我犯了一个错误 ， 就是在聊天的时候使用了一个表情 ， 我以为那个表情是 ， 嗯 ， 类似于心照不宣 ， 或者是 ， 呃 ， 你懂的那种感觉 。

但是实际上那个表情的中文内容是 ， 呃 ， 与这个表情关联的中文词汇是 " 舒服 "。 哈哈哈 ， 就是一个小人。

**吴涛** [9:15]
啊 ， 就是闭眼睛 。

**Rio** [9:17]
闭着眼睛然后微笑那种感觉 ， 对 。 然后 。

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

**Rio** [9:21]
对 ， 对 。 然后我把它用 ，也不能用错了吧 。

**吴涛** [9:26]
挺 Joy 的那个 。

**Rio** [9:27]
如果你把 " 舒服 " 这个意义放进那句话里的话 ， 这句话还挺怪的 。

**吴涛** [9:33]
嗯 ， 就这个就比较坑嘛 。 就好像以前不是有一个哲学问题吧 ， 说是 ， 呃 ， 我们所有人看见绿色的感觉都是一样的吗 ？

好像结论是是 ， 对吧 ？ 就是比如说 ， 我说我看见了一个绿色 ， 你说你也看见了一个绿色 ， 对吧 ？

假设我们都认为客观的看见是绿色 ，但是这个绿色在你心目中形成的一个印象 ，是跟我是一样的吗 ？

**Rio** [9:55]
这肯定不是啊 。

**吴涛** [9:56]
我觉得这有两层 ， 两个层面吧 。 一个是就是在基因上面 ， 或者说在生物性上面 ， 我们肯定多多少少受到的刺激都是一样 ， 完全一致可能也不是 ，但是主要是心理上 。

你后天你对在成长过程中对绿色产生的印象 ， 甚至于你看到最多的绿色 ， 比如说你在寒带长大 ， 你看到的绿色可能就深一点 ； 你在草原长大可能就接近于草绿色 。

哪怕让你 ， 我说我们四个人每人想象自己心目中的绿色 ， 那想象出来的绿色应该都是不一样的 。

**Rio** [10:34]
嗯 ，OK。 那这就是一个原理嘛 ， 就是我们看到同一个这个 Emoji， 当没有那个文字提示的时候 ， 我们看到第一反应 ， 比如说吴涛他把说他看到那个图像 ，他觉得这个是一个心照不宣的意思 ，但可能别人看到 ，因为他不同的这个教育背景 ， 或者是这个所处的这个环境 ，他觉得这个是完全是另外一个意思 ， 对吧 ？

就很难嘛 ， 这件事情 。

**吴涛** [10:56]
但语言其实都有这个特质 。

**Rio** [10:59]
而且还有一个就是 ， 我又想想另外一个例子 ， 就是那个月亮 ， 呃 ，Emoji 里面不是有个黑色的月亮的圆形的脸吗 ？

然后据说很多 ， 呃 ，teenager， 就现在的 teenager， 用这个圆形的黑色月亮的脸来代表那个黑人问号脸 。

**吴涛** [11:19]
对对 ， 上次我们讲过这个问题 。

**Rio** [11:21]
What？ 这段必须剪掉 ， 暴露了我很久很久没有上节目的 ， 连自己录完节目连自己都没有说一遍 。

**吴涛** [11:36]
没错没错 。

**Rio** [11:38]
我曾经把一个一模一样的故事给两个朋友在同样的地点讲过三遍 。

**吴涛** [11:44]
哈哈哈 。 中老年程序员表示躺枪 。

**Rio** [11:48]
我完全是一个场景 trigger 的人， 我发现只要在那个场景就会讲这件事 。

**吴涛** [11:53]
哈哈哈

。

**Rio** [11:57]
我记得以前那个 ， 我记得以前那个语言学里面其实也有讨论过这个概念 ， 就所谓传统的这个结构主义的语言学 ， 它会分能指和索指嘛 。

对 ， 所以我们其实现在看到了 Emoji， 或者是我们使用一个语言的单词 ， 都是那种语言学观点里所谓的这个能指 ， 然后它指向的这个意义应该是索指 。

最早的话 ，他们会认为索指就是所指向的这个东西本身 ， 比如说我们说一个苹果 ， 那么指向的可能就是一棵树上的一只苹果 。

但是后期的一些语言学者就会认为 ，其实你指向的那个索指并不是真正的那个食物 ，而是一种心理层面的 ，他们所谓的心理表象 ， 就是一种由社会共识约定出来的东西 。

**吴涛** [12:43]
意志 ， 意志与表象的世界 。

**Rio** [12:45]
对对对 ， 就是你永远无法指向 。

**吴涛** [12:48]
嗯 ， 就某种水果的抽象一个概念 。

**Rio** [12:50]
永远无法指向一个真正意义上的苹果 。

**吴涛** [12:53]
啊 ， 所以什么时候我们才能够实现这个 ，不要通过语言啊 ， 或者文字啊 ， 这种介质 ， 能够直接咱们脑子插线 ， 直接交流这个意识就好了吧 ？

就不存在这个问题了 。

**Rio** [13:04]
Telepath 是吧 ？

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

**Rio** [13:05]
心灵感应 。

**吴涛** [13:06]
我一想 ， 哎 ， 你就知道我想什么了 ，而且非常准确 ， 对吧 ？ 没有任何的疑义 。

**Rio** [13:13]
对 ， 我觉得下一次真正意义上的这个 ， 呃 ， 通信革命 ， 可能就是真的是不依赖于语言的通信革命 。

**吴涛** [13:21]
哇 ， 那会很恐怖啊 。

**Rio** [13:22]
对啊 ， 我一想 。

**吴涛** [13:23]
对啊 ， 我觉得会很恐怖 。

**Rio** [13:24]
你稍微脑子里面有点什么污秽的想法 ， 哎 ， 对方马上就知道了 。

**吴涛** [13:27]
不 ，不 。

**Rio** [13:28]
不是跟三体人一样 ， 你想什么就必然让对方知道 ，而是你可以以一种 ， 呃 ， 超越我们的 。

**吴涛** [13:35]
就是普通开关是吗 ？

**Rio** [13:37]
不是 ， 就是以一种超越我们现在这样通信带宽的方式来通信 。 就是你像我们现在为什么要上十年乃至二十年的学 ，其实另一个原因就是语言沟通的 。

**吴涛** [13:51]
就学会一个 codecs。

**Rio** [13:53]
乃至于文字沟通的 。

**吴涛** [13:54]
对吧 ？

**Rio** [13:55]
呃 ， 对 ， 效率太低了 。 你想我们现在说话可能一秒钟才几个比特 ， 对吧 ？ 几个 bit。 那将来如果我可以在一秒钟之内向你讲完整个 ， 呃 ， 地球 ， 古代地球的历史 ， 那可能我们教育在五到六年里面能教的东西就多太多了 。

这样人的这个寿命又被大大延长了 ， 难道不是吗 ？

**吴涛** [14:23]
嗯 ，但问题是接收方想不想要了 。

**Rio** [14:28]
其实就是重新去那个叫什么来的 ， 如果假设你大脑是一堆神经元来构成的话 ，其实就是我直接把我这个叫什么 ， 现在不是流行讲机器学习吗 ？

我先 train 一个 model， 然后直接把这个 model 塞给你就好了 。

**吴涛** [14:40]
差不多是这个意思 。

**Rio** [14:41]
你不用再去 train 一遍了吧 ？

**吴涛** [14:44]
好了好了 ， 我们怎么全部停了 。

**Rio** [14:46]
你请了两个以无主题的闲聊做了这么多期节目的人来 ， 你应该已经预料到这个后果了 。

**吴涛** [14:53]
我要把你们拉回来 。

**Rio** [14:56]
好了好了 。

**吴涛** [14:57]
呃 ， 除了 ， 啊 ， 好多听众都说这一期太搞笑了 ， 哈哈哈 ， 这个在无论是在群里面 ， 还是在我们的自弹自唱的那个反馈里面也是蛮多的 。

然后但是也有一位听众非常认真的给我们写了一篇很长的反馈 ， 珍羽是不是要给大家念一下 ？

### 机器学习

**Rio** [15:16]
嗯哼 ， 好吧 。 啊 ，在念这个反馈之前 ，其实有一个跟刚刚说到的相关的 ， 就是刚刚正好说到机器学习 ，其实有个听众他写信来问这个机器学习的事情 。他说关于机器学习在书法字体或者字体上的研究和应用有什么进展吗 ？

啊 ， 对 ，他邮件就是这样 ，他说这个邮件就是如此 。

**吴涛** [15:37]
不是有那个风格转移吗 ？ 那个 。

**Rio** [15:40]
对 ， 好像是有一个基于神经网络来学习这个 。

**吴涛** [15:43]
就简单来说就是他学习了 ， 比如说这个 ，他是以画作来做的吧 ， 我记得 。 就假设他学习了这个毕加索的这么一个风格 ， 然后他 ， 你给他任何一个图像 ，他会把它变成那种毕加索风格的那种图像了 。

那本质上做这个叫什么 ， 这个书法其实也是一样嘛 ， 某一个比如说什么掩体 ， 呃 ， 什么流体之类的 ， 对吧 ？

他就学习他的那个一些书法风格嘛 ， 然后把它弄来之后， 通过利用类似的这个 ， 这个叫什么 style transfer， 好像是叫这个吧 ， 这么一个 ， 呃 ， 一个技术 ，也是可以把它转换成另外一个任何字 ， 比如说变成这个流体或者那种感觉的 。

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

**吴涛** [16:20]
因为本质上那些书法家去临摹也是做同样的事情嘛 ， 就他可以学习到所有的这个掩体的这个精髓 ， 对吧 ？

然后再自己再加上一些创新 ， 或者是他就纯粹想复刻 ，因为我是做这个赝品的 ， 对吧 ？ 我专门去临摹别人的这个名作 ， 然后我就复制出一样的这个感觉的 ，也可以啊 。

就本质上我觉得是同样的事情 。

**Rio** [16:44]
嗯哼 ， 对 ， 我记得前两天 Rex 给我发过一篇文章 ， 呃 ，是标题叫什么 《Analyzing 50k Fonts Using Deep Neural Networks》。 然后他应该是从网上下了大概五万个免费字体 ， 然后用一个这个 deep neural network， 深度神经网络 ， 来把它 train 了一遍 。

但是具体做了什么我还没有仔细看 ，不过大概意思就是提取了很多特征 ， 然后可以做一些好像还蛮酷的事情 。

呃 ， 我把链接放在那个 show notes 里面吧 ， 就如果有兴趣的读者可以去看一看 。

**吴涛** [17:28]
哦 ， 这里有篇论文也可以给你们发一下， 就是讲那个 style transfer 的这个论文 。 还有一个 GitHub 的代码可以自己去玩 。

**Rio** [17:37]
我记得好像中文这个字体设计领域也有人写过论文 ， 就是讲怎样将这个中文字体用类似风格转移的方式来实现出来新的这种字体 。

**吴涛** [17:49]
啊哈 ，OK。

**Rio** [17:50]
好像国内还有厂商在应用类似的技术 ， 可能不是非常的深度的用 ，但是可能在设计的这个初期阶段会使用一些相关的辅助技术 。

**吴涛** [18:02]
所以以后这个什么 ， 呃 ， 艺术家可能就比较着急了 。

**Rio** [18:08]
不不不 ， 艺术家的意义在于艺术家 。

**吴涛** [18:10]
临摹艺术家 ， 对对 ， 临摹艺术家应该是 。

**Rio** [18:13]
嗯哼 ， 就是美工比较 。

**吴涛** [18:15]
比较惨 。

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

**吴涛** [18:17]
或者说以后做赝品会比较方便了 ， 直接把这个风格拿过来弄一下就好了 。

**Rio** [18:23]
就这个 ， 这个就有点像那个淘宝上那个很搞笑的那个店 ，他们卖那种什么 ， 呃 ， 那种就是中国古 ， 那种古 ， 呃 ， 叫什么 ， 山水画还是古画那种风格 ，但是画一些非常现代的东西嘛 ， 比如什么萧何月下追韩信 ， 然后骑个自行车在那里追那些 。

**吴涛** [18:39]
哎 ， 贵市的大芬村不就是干这个的吗 ？

**Rio** [18:41]
哈哈哈 ， 大芬村我还没去过 。

**吴涛** [18:46]
什么岗 ， 解释一下 。

**Rio** [18:47]
大芬村是一个专门复制这个世界知名油画的这样一个在深圳的一个村子 。

**吴涛** [18:54]
再多可不是这个 ， 就名不虚传的你知道吗 ？

**Rio** [18:58]
对 ，而且据说复制的挺好的 。

**吴涛** [19:01]
对对对 ， 什么都可以山寨 。

**Rio** [19:05]
好 ， 那最后来念那篇非常长的邮件 。 啊 ， 这位听众的署名是 PK，他邮件标题是 《Emoji 路漫漫词修远兮 》。

各位主播好 ， 听你们的节目有一段时间了 ， 从中获益匪浅 。在这里先感谢各位的真知灼见 。 关于这次节目中聊到的 Emoji 的话题 ， 本人也想同 ， 本人也想同各位聊聊自己的看法 。

本人目前在 G 开头的互联网公司 ， 参与设计新一代系统里的 Emoji 工作 。 从今年四月份加入这个项目组 ， 一眨眼已经半年了 ， 整个 Emoji 项目也接近尾声了 。

很荣幸能在参与大公司中如此具有影响力的项目 。 记得一开始对于 Emoji 的了解 ， 仅仅是平时在 iOS 里使用的一些 smile faces，但是随着项目的展开 ， 与 Unicode 组织的成员沟通之后， 发现其中还是有很多不一样的情况 。

首先个人发现中国使用 Emoji，iOS 也好 ， 安卓也好的频率 ，其实远不及西方国家来得高 ，因为中国有微信表情包 ， 我们称为 sticker， 类似现在 iMessage 里的贴纸 。

后来发现韩国和日本由于 LINE 的大热 ，也有很多用户选择了 App 商店里的 sticker，但是在西方 ， 举例来说在 Instagram 上， 就可以看到很多 Emoji 的 comment 与标题 ，iMessage 也比在中国使用的情况要频繁许多 。

这也就是为什么 Emoji 这几年的谈论中心都在西方的原因 。 或许我没有确切的数据 ，但是直观感受是这样的 。Emoji 今年最热的话题其实是加入了女性职业 。

记得我们 team 绘制的女性职业 Emoji， 教师 、 工程师 、 程序员等等 ，在美国成为新闻 。 公司还特意印刷了贴纸和 t， 追求男女平等 、 性别中立的态度 ， 似乎在任何平台上都是一样的 。Rio 说得对 ， 政治正确有时候很浪费时间和精力 ， 这里我就不细细展开了 ，有机会的话当面说会比较方便 ， 哈哈 。

当然苹果确实是第一家完整的绘制了 Emoji 的商业公司 ，但是现在打开 Unicode 的总表 ， 可以看到各大科技公司都有很完整的 Emoji 清单 。

但是谁画的 ，但是谁画得早 ， 谁的市场占有率高 ， 却是一个不争的事实 。 后来者就需要和苹果统一 ，不然跨平台发送信息就会造成理解偏差 。

这也是我们在设计新版 Emoji 的着重考虑的 。 各位主播还谈到了 Emoji 的格式 ， 确实 SVG 是目前最好的解决方案 ，而非 PNG。

当然苹果的 Emoji 包在手机系统里占比是最大的 ，因为复杂的渐变和三维立体的效果 ， 比如跑步的人， 会耗费很多珍贵的手机容量 。

微软目前的 Emoji 作为我个人是最喜欢的 ， 各位可以在总表上看到 ， 与众多商业公司都不同 ， 虽然没有了渐变和复杂的图形 ，但是独特的视觉风格和统一感是其他公司没有做到的 。2017 年 1 月末 ， 我就将完成第一版完整的全新 Emoji 在下一代系统上 。

我很希望能够尽快向各位展示新的 Emoji。PS， 同时我也想说 ，Unicode 组织应该多考虑考虑中国的元素 ， 至今没有真正属于中国的 Emoji， 这是让我这个画 Emoji 的人深感遗憾的 。OK， 所以居家的这个下一代操作系统上会有新的 Emoji 吗 ？

下一代是哪一代了 ？

**吴涛** [22:40]
O 啊 ，Android O。

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

**吴涛** [22:43]
首先呢 ， 我们 ， 呃 ， 我们先要认识到他这封邮件是 2016 年写的 。

**Rio** [22:49]
啊 ， 对对对 。

**吴涛** [22:50]
我们上次节目是 2016 年的 11 月播出的 ， 所以他说的今年和去年其实已经倒过来了 。 然后我们去年 11 月份节目刚刚播出 ，Unicode 就已经在 ， 呃 ，Unicode 是在 2016 年 11 月的 28 号发布了新的一批 ， 就有 113 个的新 Emoji。

**Rio** [23:09]
啊 ，是在我们节目发布当天发布的 。

**吴涛** [23:12]
呃 ， 对 ， 就是就马上就发布了 。 但是呢 ， 当时发布的那些东西 ，因为已经事先有提案嘛 ， 所以我们已经在节目里有谈到了 ， 比如说就包括医生 、 教师啊 ， 会怎么怎么样的 。

嗯 ， 现在呢 ， 估计已经在那个 iOS 上大家都可以看到了 。 那现在 Emoji 呢 ， 还有 5.0 的这个 beta 版本 ， 那 5.0 这个版本要马上随 Unicode 10.0 发布 。

那这个时间点现在已经 ， 呃 ， 刚好是今年的 3 月 20 号 ， 嗯 ，是 3， 呃 ， 反正今年 3 月份呢 ， 就已经 Unicode 10 的 beta 版本已经公开了 。

那按照 ， 按照时间表的话 ， 就是今年的夏天 ， 应该是 6 月份 ， 就要再公布新的 Unicode 的 10， 那里面呢就会有新版的更加追加的一些 Emoji。

嗯 ， 这里面呢 ， 包括什么 ， 包括那什么吸血鬼和僵尸 。

我觉得最扯的就是那个什么 ， 连僵尸还有女僵尸 。

**Rio** [24:15]
我想要停顿一下， 我想知道说到僵尸之后大家都敬畏了 ， 沉默一下 。

**吴涛** [24:21]
不是 ，他是吸血鬼 ， 吸血鬼有男吸血鬼 、 女吸血鬼 。

**Rio** [24:26]
What？

**吴涛** [24:27]
啊 ， 这个很符合 ， 很符合现实啊 。 哈哈哈 ，不是 ， 很符合各种那种同人小说 。 嗯 ， 然后上期节目里我们谈到了就是那个吃的东西 ， 啊 ， 那个 ， 那个什么 pretzel 没有是吧 ？

然后呢 ， 这个新版里面就会有了 ， 所以吴涛你不用挂怨念了 。

**Rio** [24:49]
非常好 。

**吴涛** [24:49]
嗯 ， 然后呢 ， 针对这位听众的写的内容 ， 我想说一句就是说 ，他说希望 Unicode 组织多考虑中国元素 ，其实这个 Unicode 一直都是公开的 。

如果你想追加任何的一些字符 ， 呃 ，不包 ，不仅是 Emoji， 啊 ， 你想 ， 比如说你想收其他文字 ， 任何人都可以给 Unicode 直接写提案 。

但是呢 ， 就是因为 Unicode。

**Rio** [25:14]
没有人去鸟这件事情 。

**吴涛** [25:16]
对 ， 对 ， 然后呢 ， 只是说 Unicode 他们那个提案呢 ，他们是有格式的 ， 你必须按照那个格式写 ， 然后把提案交上去 。

那至于 ， 那 ， 那可以放到定 ，他们会定期开会 ， 定期讨论这个事情 。 啊 ，也就是说每个人都 ， 这个渠道是开放的 ， 就每个人都可以做的 。

嗯 。

**Rio** [25:34]
我觉得他说那个事很好 ， 就是中国是像 ， 就东亚吧 ， 就中日韩都是用那个 sticker 比较多嘛 ， 用那个 Emoji 反而比较少 。

因为 。

**吴涛** [25:43]
这个就是被平台 ， 被平台的碎片化掉了呀 。 对呀 。

**Rio** [25:47]
不是 ， 就是 sticker 本来它的这个 expressiveness， 就是这个可表达的丰富性 ， 太是远远强大过这个 Emoji 啊 。

**吴涛** [25:58]
我把日本人拉进来用微信的时候 ， 日本人就觉得很奇怪 ， 为什么这里面有那么多企鹅的图 ， 看起来蛮可爱 。

**Rio** [26:04]
哈哈哈 。 可是日本人用 LINE 啊 ，LINE 里面的 sticker 不是更多吗 ？

**吴涛** [26:11]
就那个是起源嘛 。

**Rio** [26:12]
对啊 ， 所以他们就觉得很奇怪 ， 为什么就 ， 为什么 WeChat 里面有这么多企鹅 ， 就单单企鹅有 。

**吴涛** [26:18]
你是说 ， 你是说 WeChat 在那个表情里面有很多企鹅 ？

**Rio** [26:22]
对 ， 表情嘛 ， 就相当于那个表情嘛 。

**吴涛** [26:25]
对 ， 就有一组企鹅的表情 。

**Rio** [26:28]
对啊 ， 对啊 ，因为他们不知道这是腾讯的嘛 ， 所以 。

**吴涛** [26:31]
对对对 ，他们不知道企鹅这个梗 。

**Rio** [26:34]
对啊 ， 所以我觉得这个就是 ， 呃 ， 就西方玩这个 Emoji 这么上纲上线 ， 还要怎么政治正确 ， 要男女平等 ， 这个根本在东亚根本就不是一个事儿 ， 好吧 。

### 贴纸大战

**Rio** [26:46]
你说我爱画啥画啥 ， 管得着吗你 。

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

**Rio** [26:50]
然后在 。

**吴涛** [26:50]
小熊猫都是以政治不正确而流行的 。

**Rio** [26:54]
对 ，而且就是说你说像 Emoji，Unicode 这种组织 ， 我要加个 Emoji， 我还得给你费劲提那个什么提案 ， 还要等你下个 ， 下一个版本再更新的时候 ， 那个你看微信表情包里面 ， 人家已经直接出整套 ， 整套表情包可以收费了 。

**吴涛** [27:08]
可是这个 orientation 不一样啊 ，Unicode 的目的并不是让你有更多的 ， 呃 ， 表情可以用啊 。

**Rio** [27:16]
而且我就说 ，因为就是你要考虑用户的这个使用表情 ，Emoji 也好 ， 还是 sticker 也好 ， 它的初衷是什么 ？ 它是要表达一些文字不太好表达的意思嘛 ， 对吧 ？

然后 。

**吴涛** [27:28]
但是我的点就是 Unicode 并不是让你 ， 呃 ，并不是满足这个需求而存在的 。

**Rio** [27:34]
对 ， 那就我 ， 我没错啊 ， 就所以说我本来我一开始的理念就是 Emoji 这东西就不应该在 Unicode 里面去搞吧 ， 大家用 sticker 就好了 。

**吴涛** [27:46]
你要这样说的话 。

**Rio** [27:48]
我觉得最大的问题就是 Emoji，Emoji 实际上是一个 ， 呃 ，不能说生造出来的概念 ，但它的确是一类符号的统称 。 就是有些符号是 ， 你是很难说它到底算不算 Emoji。

首先 Emoji 本身最开始是个工程概念 ， 对吧 ？ 就某一个公司推出了一系列符号 ， 然后这些符号被称为 Emoji。

**吴涛** [28:12]
还是一个 hack。

**Rio** [28:12]
然后， 嗯 ， 对 ， 然后比如说这些符号里面包含什么 OK， 或者包含什么平城 、 昭和 ， 或者包含什么各个星座符号 ， 那你说星座符号应不应该 ， 应不应该被收到 Unicode 里面 ？

显然是应该的 。 那这个边界在哪 ？ 然后， 呃 ，Emoji 这个 ，Emoji 这个集合跟 Unicode 这个集合到底是一个完全子 ， 就它是它的一个纯子集呢 ， 还是 ， 还是 ， 还是它们两个其实是 ， 就如果你一定要找一个界限说 ， 啊 ， 如果画了一个笑脸 ， 那这个笑脸就不应该被收到 Unicode 里面 。

呃 ， 那这个界限在哪 ？ 这 ， 这很难找的吧 。

**吴涛** [28:52]
嗯 ， 对啊 ， 所以现在就一发不可收拾了嘛 。

**Rio** [28:56]
嗯 。

**吴涛** [28:57]
而且 sticker 跟 Emoji 之间的界限其实也挺模糊的 ， 说实话 。 就是 ， 呃 ， 比如说 ， 比如说那个周润发的那张脸 ， 它会被拼到各个地方 ， 对吧 ？

那会不会 20 年后周润发的这张脸 ， 啊 ，不是周润发 ， 那个人叫什么来着 ？

**Rio** [29:18]
张学友 。

**吴涛** [29:19]
韩国那个吧 。

**Rio** [29:20]
张学友 。

**吴涛** [29:20]
不是吗 ？ 张学友 ， 张学友 ， 张学友 ， 张学友那个你吃屎啦那张脸 ， 说不定 ， 说不定 20 年后也会变成 Unicode 的一部分呢 。

**Rio** [29:30]
需要用一个什么 sticker 的这种类似于 ， 哎 ， 那个 ， 那个 Unicode 那个组合字符这些东西叫什么来着 ？composition， 对吧 ？

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

**Rio** [29:38]
然后要把张学友加某一个轮廓就组成那个 sticker， 对吧 ？

**吴涛** [29:43]
对 。 不过我觉得既然已经做 Unicode 了嘛 ， 一个比较合 ， 一个 ， 呃 ， 理性化的一个 approach 应该是说 ，有这么多码位的码 ， 那我们就做一个张学友体 ， 然后呢 ，以张学友的这样的风格把所有的关于面部表情都画出来嘛 。

**Rio** [30:02]
那是吧 ，有男张学友 ， 女张学友 。

**吴涛** [30:05]
对啊 ， 可以啊 ， 你可以画呀 ， 如果你想画的话 ， 或者说 。

**Rio** [30:10]
小张学友 ， 男张学友 ， 男张学友和男张学友和男小张学友 。

**吴涛** [30:16]
对啊 ， 没有 。

**Rio** [30:17]
你就说你可以画 ， 你可以不画嘛 ， 那就说放在张学友体 ， 这些就变成缺字嘛 ， 对吧 ？ 很简单的嘛 。

因为 ， 因为现在也是 Unicode 放了这么多码位上面 ， 所有字体也不是所有的码位上面的 glyph 它都画出来嘛 ， 对吧 ？

它可以挑一些它想画的嘛 。 那就等于就是像换字体一样的感觉 ， 换不同的表情包嘛 。 我觉得这样是一个比较理性化的一个 approach， 说实话 。

**吴涛** [30:44]
我觉得这个有点太 over engineered 了 。

**Rio** [30:47]
我觉得 ， 我觉得本身有 sticker 了还要再去搞这个就是挺扯的一件事 。

**吴涛** [30:53]
就是在微信里面 ， 呃 ， 可能一个表情包只会流行那么几个月 ， 然后再过去之后所有人就把它忘记了 。

然后如果你按你这个方式来解决的话 ， 很有可能 ，也不是解决 ， 就是如果真的发展到你这个地步的话 ， 那我觉得可能全人类都得一直在用 sticker 来交流才有这个 ， 才有这个必要 。

**Rio** [31:15]
嗨 。 啊 ，不过话说回来 ， 这位听众里面说的就是要多考虑中国元素 ， 那这一次就是今年夏天要更新的这一批次的 Emoji 里面呢 ，也会有 dumpling， 就是这个英文 dumpling 哈 ， 然后实际上你可以画成饺子 ， 画成包子都可以 。

然后会有 fortune cookie， 就是 ， 就比如说就里面有那个吃到吉祥能抽到 。

**吴涛** [31:41]
太东方主义了 。

**Rio** [31:43]
对 ， 还有 take out box。

**吴涛** [31:45]
不不不 ， 我问你 。

**Rio** [31:47]
西方人他们的中餐的那种 。

**吴涛** [31:49]
对 ， 就是对中餐的刻板印象 。 首先 ， 凭什么 dumpling 就得能既能画成 。

**Rio** [31:55]
为什么会有 fortune cookie 会是中国元素 ？

**吴涛** [31:58]
一个煮的 ， 一个蒸的 ， 这差很多好吗 ？

**Rio** [32:01]
所以这些都是就是美国人他们提出来 ，他们觉得要进 。

**吴涛** [32:04]
对嘛 ， 然后 。

**Rio** [32:05]
然后还有筷子 。

**吴涛** [32:07]
嗯 ，不过终于有筷子了 。 好终于没有 ， 呃 ，有终于没有好嘛 ， 对吧 ？ 因为有现在是有刀叉 ， 没有筷子呀 。

**Rio** [32:15]
好吧 。

**吴涛** [32:15]
那以后一直还得上手才可以 ， 对吧 ？

**Rio** [32:17]
然后那你想啊 ， 就是又退回来干这问题嘛 。 那你觉得要有更多的中国元素的话 ， 你就做提案呗 。

哎 。

**吴涛** [32:24]
这是个问题 。

**Rio** [32:26]
对啊 ， 那总是不能说 ， 哎呀 ， 这个你不给我做了 ，其实呢 ， 没有个人在做实事 ， 没人做提案 ， 就等着美国人给你画这个东西 ， 怎么可能是 。

**吴涛** [32:36]
然后又嫌美国人画得不好 。

**Rio** [32:37]
哎 ，其实我有一个问题哈 ， 你说我们现在搞 Unicode 那么多日本的元素 ， 日本人觉得它很地道吗 ？

**吴涛** [32:44]
啊 ， 对啊 ，因为最早是日本人做的嘛 ， 所以它那就 。

**Rio** [32:49]
这个比较地道的 。

**吴涛** [32:50]
对 ， 这个码位上面要画成什么样子的话 ， 肯定一开始最早提案是日本人的吧 。 所以呢 ， 一开始会有那个什么 ， 呃 ，dango， 就是那个什么串儿 ， 烤串儿啊 ，有那些东西的嘛 ， 那都是日本的嘛 ， 所以美国人就看不懂这个是什么东西啊 。

**Rio** [33:07]
哎 ， 你们有关东煮 actually。

**吴涛** [33:09]
啊 ， 对 ，有各种各样的东西 。

**Rio** [33:11]
不 ， 我的意思就是说有没有可能出现那种情况 ， 就是可能很多这个 ， 呃 ， 就像刚才我们说这个 fortune cookie 这种东西 ，其实是很美国的中国嘛 ， 对吧 ？

就是有没有类似 ， 就日本人觉得这个东西虽然说它画的是一个日本元素东西 ，但其实是很美式的 。

**吴涛** [33:27]
这个其实我们上次也说过嘛 ， 比如说有一个 Emoji 是 mountain， 就是山脉嘛 ，在日本他们默认他们画会画成富士山嘛 。

但是当这个放到 Unicode 的时候 ， 那后来 Unicode 就改成就普通的山嘛 ， 对吧 ？ 但是对于日本人来讲 ，他们一想的话 ，他默认肯定会画一个富士山嘛 。

**Rio** [33:45]
日本人别的什么名山了吗 ？

**吴涛** [33:47]
其实日本人有一个天然的优势了 ，因为 Emoji 它其实是有一个原始集合的 ， 这个原始集合是从日本来的 。 那么当时的那些日本元素就是非常地道的日本元素 。

那么 Emoji 在形成这个原始集合的时候 ，其实是直接保留了这些元素 ，但后来加进去的可能就不那么的地道了 。

**Rio** [34:08]
即使是后来加进去的 ，也就是看提案 ， 做提案的人觉得应该怎么做嘛 ，他就会放进去嘛 。

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

**Rio** [34:15]
所以啊 ， 说实话 ， 这一次虽然加进去的 ， 比如说有筷子 ，有饺子这些东西 ，但是做提案的肯定是美国人， 不是中国人， 所以要画成这个样子 。

**吴涛** [34:25]
对 ，其实我一直觉得 Emoji 在这个方面是有一个问题 ， 就是我们知道 Emoji 最初的那个原始集合 ， 它其实是先有很多人去用它 ， 然后再渐渐地稳定下来的 。

也就是说它其实是形成了一个被一部分人已经非常熟悉并且认可它的这样子的一个图形化的集合 。 那么新的提案 ， 你可能只是先提出一个你觉得需要的概念 ， 然后再对这个概念生成一个图像 。

就按我的理解 ， 大致上是这样一个流程 。 所以其实跟原来形成 Emoji 的方式已经颠倒过来了 。

**Rio** [34:59]
嗯哼 。

**吴涛** [35:00]
对 ， 这种颠倒可能会造成就是你这个概念未必真的适合变成一个图像 ， 又或者说你这个概念跟大家希望得到的和真正实用的这个图像之间是脱节的 。

**Rio** [35:13]
所以这个提案拿到 Unicode 会议上去 ， 开国际会议进行讨论的时候 ， 就会有各种各样的问题 。 大家就觉得的确这个码位是需要 ，但是不能画成这个样子 ， 或者不能画成那个样子 ， 就扯皮 。

就是在实际上在会议讨论 ， 大家讨论就是这个东西 。

**吴涛** [35:30]
对对对 ，而且另外一方面就是我会觉得它扼杀了原本这个新 Emoji 出现的这种原有的那种活力 。 就原有的新 Emoji 可能它这样出现 ， 就是有几个小团队 ，他们可能想新试用一个图标来放到这个他们认为的 Emoji 的集合里面 ， 然后用着用着 ， 可能这个图标很受欢迎 ， 它就渐渐地变成一个常规的 Emoji 了 。

但现在这种渠道感觉就不那么的可能了 ，因为大家一定会先想 ， 如果这个码位 Unicode 都没有的话 ， 我做出来也没人会用 ， 所以我一定要先把这个码位搞出来 。

**Rio** [36:05]
其实完全不用担心啊 ， 那帮人早就转化 sticker 去了 。

**吴涛** [36:09]
好吧 ，但 sticker 现在就是为了跟这个 Emoji 区分 ， 它的这个图像表现力实在太丰富了 。

**Rio** [36:16]
对嘛 ， 所以还是回到刚才我说的那个问题嘛 ， 既然有了 sticker， 折腾这么多 Emoji 干啥 。

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

**Rio** [36:25]
好吧 ， 所以关于 Emoji 的讨论到此结束 。

**吴涛** [36:31]
我们其实还有主题 ， 我们已经说了将近半个小时了 ， 已经超过半个小时了 ， 同学们 。

**Rio** [36:36]
没事 ， 时间减就好了 。

**吴涛** [36:42]
反正不是你减对吧 ？

**Rio** [36:43]
对啊 。

**吴涛** [36:44]
对啊 ， 这样子说话不腰疼 。

### 换行溯源

**Rio** [36:49]
来来来 ， 我们今天是有主题的 ， 我们今天的主题叫做风回路转换行来 。

**吴涛** [36:57]
你觉得你有掌声吗 ？

**Rio** [37:01]
我们今天来跟大家讲讲换行符的事情 。 来 ， 我们中老年程序员代表 。

**吴涛** [37:08]
啊 ？ 为什么要我说啊 ？

**Rio** [37:11]
在很久很久以前 。

**吴涛** [37:14]
在很久很久以前 ， 嗯 ， 这个 ， 哎 ， 怎么说呢 ， 就是我 ， 你们小时候用过打字机吗 ？Type writer。

**Rio** [37:25]
Type writer， 英文的打字机是吗 ？ 没用过 。

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

**Rio** [37:28]
不是 ，有中文打字机吗 ？

**吴涛** [37:30]
有啊 。

**Rio** [37:31]
有啊 ？

**吴涛** [37:32]
啊 ？

**Rio** [37:33]
难道真的是那个几千个按键的 ？

**吴涛** [37:35]
这个是年轻世代 。 不不不 ， 它不是用按键的 。

**Rio** [37:39]
它是用个手柄来挑字 。

**吴涛** [37:41]
中文打字机是千字排的 ， 大概四五千个千字排在一个 ， 可能有上万吧 ， 排在一个 。

**Rio** [37:47]
那不是千字吧 ， 那是一个钢做的 ， 那钢千 ， 冲出来的 。

**吴涛** [37:50]
钢戳 ， 对 。 然后你要 ， 你拿着一个像 ， 呃 ， 反正是可以在 XY 轴上自由移动的一个 ， 呃 。

**Rio** [38:02]
手柄 。

**吴涛** [38:04]
对 ， 没错 ， 我真的没睡醒 。 然后你挪到某一个字上面 ， 然后我压下去 ， 它会把那个字吸起来 ， 然后在纸上打一个字 。

**Rio** [38:13]
嗯 。

**吴涛** [38:14]
当然你不能叫它 type writer， 你可能只能把它称为某种 ， 呃 ， 小型的排印机器 。 不过这个 irrelevant， 就是说到打字机 ， 主要的点就是 ， 呃 ， 换行这个动作在打字机上面其实是一个 ， 呃 ，不按键的动作 。

就是打字机上面有一个卷 ， 把纸卷在上面的一个橡皮轴 ， 然后你要换行的时候需要压下它右边的一个把柄 ， 然后把它朝左拉 。

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

**吴涛** [38:50]
然后这个过程里面它换了一行 。 呃 ，不对 。

**Rio** [38:55]
就 ， 没有 ， 注意啊 ，是 ， 呃 ，是把那个打字头往左拉 ， 还是说后面那个滚筒往右动 ？

**吴涛** [39:03]
啊 ，OK， 我来再次想象一下当时用打字机的场景 。 就是打字机的顶端的那个皮棍在你按键的时候会自动地从右往左移动 ， 对吧 ？

**Rio** [39:18]
是 ， 对 ，其实动的是那个滚筒在动 。

**吴涛** [39:22]
滚筒本身 ， 对 。 然后等它挪到最左边的时候 ， 呃 ， 打字机的现在打下的最后一个字符是在指的最右边 ， 对吧 ？

然后你需要用右手把它从右往左 ， 从左往右拉 ， 对 。 这个过程叫做 ， 呃 ， 换行 。

**Rio** [39:43]
回车 。

**吴涛** [39:44]
啊 ， 这个不叫回车吗 ？

**Rio** [39:45]
啊 ， 这个过程叫做回车 ，sorry，因为那个打字机的滚筒 ， 那个滚筒叫做 carriage， 对 。

**吴涛** [39:52]
对 ， 呃 ， 就是车 ， 车厢的车 。

**Rio** [39:56]
对 ， 车厢的车 。 然后当时， 呃 ， 打字机有一种就是非常无聊的什么打字机艺术 ， 就是你可以视为现在 ASCII 艺术的鼻祖 。

只不过因为打字机 ，其实打字机本质上是一种非线性的这个设备 ， 就是你可以把一个字符打在指的任何位置 ， 然后就有人拿它来打天鹅啊什么的 。

然后其中很重要的一个点就是 ， 你每次回车的过程之中， 那个字车会回到最开始嘛 ， 所以你可以在一行上面打很多很多不一样的字符 。

**吴涛** [40:28]
叠下去是吧 ？

**Rio** [40:29]
对 。 然后有些人打一个什么 ， 就是你想象一下 A4 纸上面用一个打字机的字符打出来一只天鹅 ， 然后这个天鹅看起来像照片一样 。

就那个时候人能够闲到什么地步 ， 大概就是这种感觉 ， 对 。

**吴涛** [40:44]
就有点像那个网点浓度那样的是吗 ？

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

**吴涛** [40:49]
好 。

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

**吴涛** [40:51]
然后回车 ， 回车是这么来的 。

**Rio** [40:54]
啊 ， 就是说后面那个圆筒 ， 就那个车嘛 ， 你摁下以后， 那个车就回到就是它那个行开始的位置 ， 对吧 ？

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

**Rio** [41:03]
但是呢 ， 就是只是回到这个行的开始位置 ，并不是下一行 ，而是原来那一行 ， 就是原来那个位置而已 。

**吴涛** [41:10]
对 。 实际上， 呃 ， 空格 、tab 和回车这几个键 ， 呃 ， 做的事情都是在实体上控制那个字车的移动嘛 。

就 tab 键是让字车往下跳 ， 跳到另外， 跳到下一个级轮能把它停住的地方 。 然后空格键就是让字车 ， 呃 ， 往前进一个空位 。

然后有些比较 ， 呃 ， 做得不那么好的打字机 ， 你把 tab 键按在一个若即若离的 ， 像那个离合点的位置的时候 ， 那个字车会非常流畅地往前一下一下一下地跳 。

**Rio** [41:51]
嗯 。 那换行怎么换 ？

**吴涛** [41:55]
换行是按 return， 就是有一个实体的键是 return。 然后每次你每次要在下一行上打字的时候 ， 你都要按一下回车键 ，不不 ， 按一下换行键 ， 然后用手把那个回车 ， 把字车拉回去 。

所以早期的换行并回车实际上是两个动作 。

**Rio** [42:19]
它换行的话 ，其实就是让那个滚筒往后滚嘛 ， 对吧 ？ 这样子就挪到下一行嘛 。

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

**Rio** [42:26]
但是它换行会同时伴有回车的动作吗 ？

**吴涛** [42:30]
不会 。

**Rio** [42:31]
对吧 ？ 所以是两个动作嘛 。 就是说回车只是让那个

， 那个 ， 那个滚筒挪到指的开始位置嘛 。 然后呢 ， 键盘上摁的话 ，是让那个滚筒往后面再转 ， 转一下能挪到下一行 ， 对吧 ？

所以回车和换行是两个动作 ，而且是 ， 呃 ， 回车是要用手动的 ， 然后换行是用键盘去打的是吧 ？

**吴涛** [42:55]
对 。 就是在一些 。

**Rio** [42:57]
打字机 。

**吴涛** [42:59]
对 ， 你反映那个打字机时代的作家的那个电影里面也可以看到 ， 就是打几个字按一下回车 ， 然后要用左手去拨一下那个打字机 。

**Rio** [43:09]
嗯 。

**吴涛** [43:11]
就是这么 。 然后这个传统其实一直延续到电传打字机 ， 就在早期的 teletyp， 呃 ， 叫什么 ，tele，tele typewriter 上面也是打字 ， 就是换行键和回车键是分开的嘛 。

换行键叫做 return， 回车键叫做 ， 呃 。

**Rio** [43:29]
CR， 换行应该是 line feed。

**吴涛** [43:32]
换行 。

**Rio** [43:33]
CR 是回车 ，是 carriage return。

**吴涛** [43:36]
换行 。

**Rio** [43:36]
就回车嘛 ， 把那个 ， 把那个整个车回到开始位置 。

**吴涛** [43:41]
字车回去 。 然后， 呃 ，carriage return 经常被写成 return， 就是出现 return 键 。 然后新换行是 line feed， 就是一个专门有个键写着 line feed， 然后你要按一下 line feed， 它才会产生新一行 。

而 return 其实和现在的那个 Home 键的作用是一样的 。

**Rio** [44:01]
嗯 ， 只是单纯挪到现在那一行的开头而已 。

**吴涛** [44:05]
对 。 然后德语打字机上面 ， 呃 ， 德语的电传打字机上面那个 return 键写成 ， 呃 ，Position one， 就是 。

**Rio** [44:15]
哈 ？

**吴涛** [44:15]
第一位 ， 对 。 然后一直到今天在德语的那个小键盘上面 ，Home 键还是叫 Position one。

**Rio** [44:23]
嗯嗯嗯 。 就是行首嘛 ， 所谓的 。 对 。 所以又有一个问题 ， 就是在实体键盘上面 ， 我们常说的那个回车键 ， 那个键 ， 那键位上到底是 return 还是 enter，也有这样的一个问题吧 ？

**吴涛** [44:39]
现在我在用的这块苹果键盘上面都有啊 ， 大字标的是 return， 小字标的是 enter，有什么区别吗 ？

**Rio** [44:46]
这个就是这里有三个 ， 这里实际上有三个语义 。 第一个语义是新行 ， 就是 line feed； 第二个语义是回车 ， 就是 return； 第三个语义是输入 。

就是你说我的指令已经下达了 ， 按下 enter 的键的时候 ， 完成的是 ， 呃 ， 指令下达这个动作 。

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

**Rio** [45:08]
就是有可能这三样事情是完全同时发生的 。 比如说你在一个 terminal application 里面 ， 你打什么 LS， 然后按这个键 ， 那它同时做了三件事情 。

首先它输入了一个回车 ， 呃 ， 第二它开始了一行新的内容 ； 第三它把 LS 这个指令输入给了你的 terminal。

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

**Rio** [45:29]
对吧 ？ 所以像英文它叫 enter 嘛 ，其实就是输入嘛 ， 对吧 ？ 进去了嘛 ， 就把那个东西 ， 把刚才那个命令给输进去了嘛 。

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

**Rio** [45:39]
嗯 。 现在苹果的机器的话 ， 我不知道你们大家还用不用那个带数字键的 ， 那个大 ， 就是有线的那个键盘 ，而不是普通的蓝牙小键盘 。

因为蓝牙小键盘和那个 ， 呃 ，MacBook 是一样的嘛 。 但是大的有线的键盘呢 ， 就右边还会有那个数字键的 。

啊 ， 右边那个数字键的那边上面写的是 enter。 然后呢 ， 主键 ， 就是主键盘上面大的 return， 小写的 enter。 这个 enter 和 return 在那个大型键盘上面还是有区别的 。

**吴涛** [46:16]
哎 ， 所以数字键区的那个 enter 键 ， 它没有 return 的功能吗 ？

**Rio** [46:23]
没有 。 啊 ， 就是说 ， 呃 ， 实际上呢 ， 就是在一些 application 里面是有区别的 。

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

**Rio** [46:29]
像 ， 比如很简单 ， 比如说大家用 Photoshop 的时候 ，Photoshop 有个就是文本工具 ，不是在实际上是输入嘛 ， 对吧 ？

如果你输入的话 ， 你用大键盘 ， 呃 ， 大键盘的 return 你摁下就是在 ， 你在写文本 ， 然后在文本里面换行嘛 。

但是如果你用小键盘的那个 enter， 就说明你现在这个文本的状态结束了 。

**吴涛** [46:52]
哦 ， 原来有这个区别 ， 我靠 。

**Rio** [46:54]
对 。 然后它就会跳出这个文本输入的状态 。 比如说你可以换成选择工具 。

**吴涛** [46:59]
我都是按 escape 在这种情况下 。

**Rio** [47:02]
对啊 ，因为你原来在文本输入状态下， 你一直按回车的话 ， 那肯定就是在文本里面换行 ， 换行 ， 换行 。

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

**Rio** [47:10]
哎 ， 那现在其他的文字框里面有类似的功能区别吗 ？ 我想试一下 。

**吴涛** [47:14]
嗯 ， 所以呢 ， 这个东西呢是按根据系统 ， 根据 application 的不同而不同的 。

**Rio** [47:20]
对 ， 所以你 ， 所以实际上你可以定义说 ，在我这个 application 里面 ， 如果你按 enter 的话 ，是换新一行 ； 如果你按 ， 呃 ， 如果你按 return 的话 ，是换新一行 ； 如果你按 enter 的话 ， 这个消息就会发出去了 。

**吴涛** [47:32]
哎 ， 真的哦 。

**Rio** [47:33]
OK。

**吴涛** [47:34]
哎 ， 你可能 ， 我现在在其他地方试出来也是这样子的 。

**Rio** [47:37]
所以呢 ， 主要关系就是说 ，因为在 Mac 里面呢 ， 原来的 return 和 enter 是不一样的 ， 所以你可以分别定义不同的动作 。

而且呢 ，在 Mac 的键盘实体上的确有一个 enter， 一个 return 的键 ， 你可以分开来 ， 分别按这个键以达到不同的动作 。

**吴涛** [47:53]
哎 ， 我想问一下， 如果那个就是主键区的那个 enter 和 return， 怎么能够按到那个 enter 呢 ？

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

**吴涛** [48:00]
我不知道 ，是 function 吧 ， 应该是 。

**Rio** [48:03]
是 function。

**吴涛** [48:05]
哦 。其实我觉得它是这样的 ， 就是它首先是它能触发那个叫什么 ， 键盘上那个扫描码是不同的 。

然后其次看那个 application 对这个扫描码进行一个什么处理 。 我觉得很多 application 会对 enter 和 return 这两个扫描码做一个统一的处理 。

就有些 。

**Rio** [48:25]
都一样 ， 我认为 。

**吴涛** [48:26]
对对对 。 就是它认为这个键在我这里不需要区分 。 对 ，但有些 app 可能它会不一样的处理 。 另外还有一些 app 它可能都不去捕捉这个扫描码 。

它可能通过另外一层的方式来确定你按了什么键 。 然后， 比如说你按了某一个组合键之后， 我给你另一个反馈 。

**Rio** [48:46]
哎 ， 所以 ， 所以 ， 哎 ， 等一下 。 那其实像这个 Mac 这个键盘上， 它标这个 return 上面再小一个 enter， 它其实表示这是一个 ， 这个键有两个含义吗 ？

还是什么意思 ？

**吴涛** [48:56]
应该是吧 。 我是这么理解的 。

**Rio** [48:58]
是的 。 因为你看像上面那个 option 和有 alt 的那个标识嘛 ， 它就说这个 option，Mac 上面的 option 等于这个 Windows 上面的 alt 嘛 。

**吴涛** [49:06]
嗯哼 。

**Rio** [49:07]
这样一个标记也是最近才开始的 。 以前它只有 option，而不写 alt 那个字的 。 像这个主键盘那个小 enter 也是最近才开始标识的 。

以前都不标的 。

**吴涛** [49:20]
嗯 。 有意思 。

**Rio** [49:23]
对 ， 这个是因为有一些 ， 比如说 ， 呃 ， 最实用的场景就可能你弹出一个对话框 ， 你可能按这个 enter， 你显然不是做 return 这个事情 ， 你显然做的是 enter 的这个事情 。

**吴涛** [49:34]
嗯 ， 就是我到底是要换行还是确认输入 ， 对吧 ？

**Rio** [49:37]
对对对 。 很多时候你只是发一个确认的指令 ，而甚至说在那个 UI 上根本就不可能出现 return 这种操作 。

所以如果它只标 return 的话 ， 可能会让人觉得有点疑惑 。 所以 。

**吴涛** [49:48]
就聊天框里面就是这样子的 。 比如说我给你发一个这个微信的那个下面聊天框 ， 好像是默认你按这个回车它是发出去是吧 ？

然后你可以 ， 哎 ，不是 ， 微信我不知道 ， 就 QQ 是可以调的嘛 ， 对吧 ？

**Rio** [50:00]
嗯哼 。

**吴涛** [50:01]
嗯 ，QQ 可以调是你 。

**Rio** [50:02]
QQ 以前默认的是 control return 吧 ？

**吴涛** [50:05]
就 QQ 是发送还是换行 ？

**Rio** [50:08]
发出去 ， 发出去 。

**吴涛** [50:09]
OK。 然后你直接按单独的按 return， 就只是把那个 ， 只是换一个行 ， 你再打一行字而已嘛 。

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

**吴涛** [50:16]
然后有个选项 ，有个选项是可以调整这个 ， 就是刚好是反过来的 。

**Rio** [50:20]
对对 。 这个其实就是 ，因为 control return 其实它做的是 enter 的事情嘛 。

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

**Rio** [50:27]
呃 ， 我刚 ， 我现在在 Photoshop 试一下 。 的确在 Mac 上的 Photoshop 的话 ， 呃 ， 的确 function return 的话就是 enter。

**吴涛** [50:38]
OK。

**Rio** [50:38]
要有按那个 function 键 。

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

**Rio** [50:41]
小键盘就用这样做 。 如果是大键盘的话 ， 就刚好那个数字键上有一个 enter 键 ， 你直接摁那个 enter 键 。

**吴涛** [50:48]
摁那个就可以了 。

**Rio** [50:49]
对 。 所以退回来还是 ， 这要看你的平台 ， 看你的那个 application 怎么对应的问题 。

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

**Rio** [50:58]
因为刚才也说了嘛 ，因为这个 enter 和 return 本来就分不清楚 ， 所以呢 ， 很多平台干脆它就不分 。

**吴涛** [51:07]
嗯哼 。

**Rio** [51:08]
像 Photoshop 这样的 ， 它是老牌的软件 ，而且它最早的第一个版本就是为 Mac 设计的 ， 所以它非常符合就是 Mac 它这个平台的操作习惯 。

**吴涛** [51:17]
这是个历史遗留问题 。

**Rio** [51:19]
对 ， 这是一个历史遗留问题 。

**吴涛** [51:20]
对 。 现在我觉得现在设计师可能更倾向于用 escape 来完成这个 enter 的操作 。

**Rio** [51:26]
但 escape 有个很危险 ， 就是它可能把你 ， 你 escape 的语义是什么 ？ 是退出那个状态吗 ？ 比如说吴涛认为他是一个 Vim 用户 ， 对吧 ？

**吴涛** [51:35]
这个在 Affinity， 比如说有些那个图像处理软件 ， 像 Affinity 里面 ， 如果你按 escape 的话 ， 然后你输入很多字就前功尽弃了 。

**Rio** [51:43]
对啊 ， 就是 。

**吴涛** [51:44]
对啊 。

**Rio** [51:45]
对啊 。

**吴涛** [51:45]
你是想撤销这个操作吧 ？

**Rio** [51:48]
嗯 。 所以我 ， 呃 ， 像我老习惯那个命令行的人， 就是特别怕摁 escape。

**吴涛** [51:56]
啊 ， 习惯性的人摁 escape 每天可能比摁 enter 的次数还要多呢 。

**Rio** [52:04]
好吧 。 那这个就是我们说的 return 这个事情 。 啊 ， 就是回车 。 然后换行的话 ， 刚才说了是叫 line feed， 所以简称叫 LF。

也可以叫 ， 叫什么 ，end of line 是吧 ？ 这狭义的换行就是 ， 就是打字机 ， 呃 ， 就是往下面挪一行嘛 。

对吧 ？ 这只是 ， 嗯 。 那广义的换行就是 ， 就是所谓的两个动作 ， 先回车后换行 ， 这两个动作合起来叫换行 ， 对吧 ？

**吴涛** [52:31]
哎 ， 可以反过来吗 ？

**Rio** [52:34]
可以啊 。

**吴涛** [52:35]
因为等效的嘛 ，是 。

**Rio** [52:37]
所以这里有个问题嘛 ， 就是到底是什么顺序 ？ 其实这个是要考虑的 。

**吴涛** [52:43]
嗯 ，是有的 。 所以现在问题来了 ， 我们 ， 当我们说换行的时候 ， 到底是 LF 还是 CR， 还是 LF 加 CR， 还是 CR 加 LF？

这四个可能都是有的 。 反正现在的话 ， 根据各个平台嘛 ， 呃 ，Unix 以及类 Unix， 包括我们现在用的那个 Mac OS X 嘛 ， 就是这一类的话 ， 我们的换行符都是 LF， 就是 line feed， 就是我们刚才说的狭义的换行 。

而我们大家常用的 Windows， 当然它之前是 DOS 嘛 ，MS DOS、Windows， 还有一些绝大多数非 Unix 的系统呢 ， 它们的换行符是两个 ， 就是先回车后换行 ，CR 加 LF。

### 平台差异

**吴涛** [53:32]
当然了 ， 除了这两种最主要的平台以外呢 ， 还有一些很奇葩的平台 。在很久很久以前 ， 比如说老的 Apple II， 呃 ， 它们那边的换行就是只有回车 。

然后非常非常罕见的一些系统呢 ， 它会刚才就说它是组合倒过来 ， 它是先换行再回车 ，也有 ，但是非常罕见 。

就我看微信上面写的一个系统 ， 我都不认识 。 什么 Accorn BBC， 这是什么鬼 ？

**Rio** [54:02]
Accorn 就是 ， 现在不是讲那个 Arm 吗 ？Arm 的前身那个 A 就是指的这家公司 。

**吴涛** [54:08]
啊 ， 天哪 。

**Rio** [54:11]
好吧 。 那不管怎么样 ， 所以呢 ， 就刚才说我们换行是跟这个系统默认会有关系的 。 所以跨平台的话常常会出现问题 。

很简单一个问题 ， 就是我 Mac 上发的那个纯文本文件 ， 发到 Windows 上， 哎呦 ， 就不行了 。 因为我 Mac 上面 ，Mac 的默认它的回车只 ， 呃 ， 换行只有一个那个 line feed 嘛 。

可是 Windows 它需要两个组合才是真正的换行嘛 。 所以 Windows 上面打开 Mac 的文件的话 ， 它是一个一长行 。

**吴涛** [54:45]
现在还有这个问题吗 ？

**Rio** [54:47]
以前是有的呀 。 现在还有吗 ？

**吴涛** [54:50]
现在我反正好像从某一个时间段开始 ， 我用 Notepad， 那个 Notepad 打开 Linux 文件 ， 好像已经很久没有注意到这个东西了 。

就大概在过去的 ， 呃 ， 四五年前 ， 就好像 somehow 那个 Notepad 已经可以自动识别了 。

**Rio** [55:10]
好像是 Win7 还是 ， 反正 XP 之后的一个系统 ，Notepad 好像有这个功能 ， 它会自动识别那个 。

**吴涛** [55:17]
搞不好是 Vista， 对 。

**Rio** [55:19]
反正 XP 是肯定不行的 。

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

**Rio** [55:22]
Windows 之后的 。Windows 的记事本 ，Windows 的记事本有很多很坑的那个东西 ， 我们后面再讲吧 。 好吧 。 嗯 ， 特别烦 。

**吴涛** [55:29]
嗯 。 事实上应该是 CL 在前 ，LF 在后是一个绝对主流吧 。

**Rio** [55:36]
呃 ， 这个情况主要出现在一个 ， 现在比如说我们现在常用那个网络 ， 你要开一个网页 ， 你要开个 HTTP 协议 ， 对吧 ？

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

**Rio** [55:44]
它那个就是 RFC 的协议规范里面 ，在 HTTP 协议里面的那个回车换行 ，是由这个 CR 加 LF 两个构成的 。

**吴涛** [55:53]
对 。 我记得它好像是有一个机械时代的这个历史遗留背景的 。

**Rio** [55:58]
因为其实要这个 ， 要 CR， 就是那个回车这个概念 ，其实是在就定宽的那个时候才需要嘛 。 就为什么呢 ？

假设 ，因为你看我们现在的这个 ， 呃 ， 文本都是默认是宽度是不限定的嘛 ， 对吧 ？ 那说到说你换行之后， 你默认是在这个就行首的情况下， 那肯定是这样子就够了嘛 。

但是如果说你那个宽度是已知的 ， 比如说以前都是 ， 比如说 80 个这个字符宽的一个 terminal， 对吧 ？ 你可以实现 ， 理论上你只 ， 它是一个两个 ， 呃 ， 两个轴在挪嘛 ， 就是 X 轴是横着嘛 。

你这个 ， 呃 ， 就是回车是把在那个横轴上移回来嘛 ， 然后那个 line feed 是纵轴上往下移嘛 。 所以如果说你那个 ， 你那个传统 ， 你不管你是传统打字机 ， 它那个纸张也是一个定宽的嘛 ， 或者说这个传统这个 terminal， 它那个行宽也是 80 个字符 ，也是定宽的嘛 。

你理论上是可以说我只换行不回车 ， 那我就是在行末 ，但是去到下一行的行末而已 ， 对不对 ？

**吴涛** [56:59]
嗯哼 。 是这样的 。

**Rio** [57:02]
但是因为在现代的这个不定宽的情况下， 你就默认是你下一行的行末在哪里呢 ？ 它是没有定义好的 。

所以最好你就 ， 那你就只能回到行首了 。 因为那一行 ， 那个理论上下一行是空的嘛 。 就在一个抽象的概念上， 下一行是没有字符的嘛 ， 对吧 ？

所以它就只能这样 。

**吴涛** [57:21]
而且你刚才说

carriage return 在你这里是进入下一行 。

**Rio** [57:29]
不是不是 。carriage return 是把那个挪回行首嘛 。

**吴涛** [57:32]
对 。 那为什么要先挪回行首再开始新的一行呢 ？

**Rio** [57:37]
因为如果你下一行是空的话 ， 你在下一行的行末的概念和行首的概念 ， 下一行行末和行首是不是同一个位置嘛 。

**吴涛** [57:45]
就是理论上也就是逻辑上下一行还不存在的时候 。

**Rio** [57:49]
对啊 。

**吴涛** [57:49]
你要先回到这一行的行首 ， 然后你再往下挪 ， 开启一个新的一行 。

**Rio** [57:56]
OK。

**吴涛** [57:56]
对 。 然后这个时候是和你直接到下一行是等效的 。 因为下一行是空的话 ， 它的行首和行末是在 ， 都在第一个字符那里嘛 。

所以其实你可以不要 carriage return 嘛 。 就这么一个问题 。

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

**吴涛** [58:09]
Make sense。

**Rio** [58:10]
嗯 。 要不然你直接跳的话 ， 就是在逻辑上还不存在下一行新的一行的行尾的问题 。

**吴涛** [58:16]
没错 ， 没错 。

**Rio** [58:17]
这个问题在 ，在那个 Vim 里面那个叫做 visual block 那个模式下也是存在 ，也是就有这个概念嘛 。 你在 visual block 下面 ， 虽然说下一行理论是没有字符的 ，但是因为它是一个定宽的一个系统嘛 ， 它会默认你到你在前面有一堆这种 ， 比如说空白 ， 比如举个例子 ， 对吧 ？

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

**Rio** [58:35]
对 ， 会有这么一个情况 。 然后刚才讲那个 ， 就是那个回车的概念 ，其实有一个场景还比较 ， 呃 ， 用的还比较多哈 ，但是只是可能这个会比较冷门一点 。

就是我不知道吴涛你有没有注意到那个 ， 我们在命令行下做很多这种所谓的进度条提示的时候是怎么搞的 ？

**吴涛** [58:54]
哦 ，是 。

**Rio** [58:56]
啊 。

**吴涛** [58:56]
先让它回到行首 ， 然后重新打印一遍字符 。

**Rio** [58:59]
对 ，因为就是重绘 ， 就在没有那个叫做 encurs， 你不用 encurs 那些系统去对整个那个终端屏幕做一个这种 ， 呃 ， 叫做矩阵式的处理的时候 ， 你就只对那一行进行处理 ， 叫做 performance 这个进度条 ， 就是求人的进度条 。

你就直接说那我回到行首 ，但是不换行 ， 对吧 ？ 重绘制一下不就好了嘛 ， 对吧 ？ 比方说我 。

**吴涛** [59:21]
这个好像是 ， 呃 ， 可以打印 ，是先打印一大堆回车还是某 ，有一个叫做 queue to the line。

**Rio** [59:31]
不用 。 你在 ， 你可以在 Python 里面直接输入这个 ， 这个就是 slash r， 就是那个 carriage return。 你输出之后， 它那个光标就是直接回到行首了 ， 然后你再打印那个东西就可以了 。

比如说我之前 ， 你要 ， 你想实现一个最简陋的这个 ， 就是这个终端命令行下面的进度条 ， 对吧 ？

你怎么办 ？ 就是在绘完那一行末尾 ，不要换行 ， 就不要输这个 slash n， 就是 new line 嘛 ， 就是那个 line feed 的那个字符 。

但是你直接输这个 slash r， 然后是这个 carriage return 嘛 。 它会 return 那一行的行首 ， 然后你再重新打印的时候 ， 它是默认在那一行的开始 ， 重新开始覆盖掉之前的字符 。

然后你做一个进度条 ， 假设比如说是 100 个字符 ， 举个例子啊 ， 然后每个字符代表 1% 的进度 ， 对吧 ？

那你直接再绘制 100 个字符就可以了嘛 。

**吴涛** [1:00:15]
嗯 。 好 。 你刚才已经把那些转译的字序列都已经说出来了 ， 你给大家再重新来整理一下 。

**Rio** [1:00:26]
呃 ， 回车是 CR， 呃 ， 换行是 LF， 对吧 ？

**吴涛** [1:00:30]
对 。

**Rio** [1:00:30]
然后在转译的时候 ， 那个 slash r 就是 return， 对吧 ？ 就是回车是吧 ？

**吴涛** [1:00:35]
Backslash。 没错 。

**Rio** [1:00:36]
啊 ，backslash。 嗯 ，backslash r。 然后 backslash， 呃 ， 换行呢 ？ 是 backslash n， 对吧 ？

**吴涛** [1:00:44]
对 。

**Rio** [1:00:44]
New line。 嗯 。 还有 ？

**吴涛** [1:00:47]
嗯 ？ 但是 new line 本身也带回车吧 ？

**Rio** [1:00:52]
呃 ，不是 。new line 就是 line feed。

**吴涛** [1:00:56]
嗯 。 可是在 Unicode 里面是不是不一样呢 ？ 你的意思是 new line 它会将这个光标定位在 。

**Rio** [1:01:03]
对 ， 这就回到刚才我说那个问题了 。 就是 new line 的逻辑上语义上它只说换行 ，但是它并没有说换行换到下一行在哪里起始 。

但是因为下一行并不存在嘛 ， 所以其实你下一行的起始和末尾是同一个概念 ，是同一个位置 。

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

**Rio** [1:01:18]
所以各个系统对于这几个实际符号 ， 它们的控制符号 ， 它们实际动作会有不同的理解 ， 造成现在不同的 。

**吴涛** [1:01:28]
不是 。 我相信前程宇刚才想说的是 ， 就是 Unicode 里面有一个 new line 的符号在 ， 呃 ， 就是它的码位跟 ， 呃 ， 回车和换行都不一样 。

然后这个 ， 这个玩意儿应该怎么理解 ？ 是 ， 它是两个连在一起吗 ？

**Rio** [1:01:47]
对 。 实际上就是我想说的就是 ， 呃 ， 我其实最初想说为什么这个 CR 和 LF 有这个顺序 ， 呃 ， 我本来想推到更早一些 。

因为传说好像是早期的时候 ，CR 和 LF 是由于机械的一些限制导致的 ，CR 这个操作的时间会长一些 ，LF 的这个操作的时间会短一些 。

就因为 CR 这个行程明显就长嘛 ，LF 的这个行程很长 。

**吴涛** [1:02:13]
对啊 。 要不然车回到那个 。

**Rio** [1:02:15]
所以通常那个 。

**吴涛** [1:02:16]
有道理 ，有道理 。

**Rio** [1:02:17]
对 。 所以通常机械指令会 ， 呃 ， 先发出这个 CR， 然后再发一个 LF。 所以我不知道它们是不是在某种程度上可以两个方向同时运行 ， 所以正好能导致这个换行的 ， 和换行和回车这个操作更快的结束啊 。

那么 ， 呃 ，其实到了这个数字领域之后， 我觉得 CR 和 LF 只是一种控制信号吧 。 你发给计算机一个信号之后， 计算机怎样在这个 GUI 上绘制这个图标的 ， 光标的行为 ， 或者是绘制下一个字符出现的这个位置 ， 可能它可以有另一套机制来匹配它 。

它未必一定要根据这个信号的先后顺序来做一些什么操作 。

**吴涛** [1:03:01]
嗯哼 。 对 。 现在其实基本上在 ， 就如果你上升到 GUI 这个层面的话 ， 大部分东西都是 ， 就下面有一层键盘驱动 ， 就是上层程序很少会需要自己去操心 。

**Rio** [1:03:13]
对对对 。

**吴涛** [1:03:14]
这个键 ， 输进来的扫描码到底是什么 ， 对吧 ？ 不然那个很多东西 ， 很多东西你还得自己做一套那个拼音输入法什么的 。

**Rio** [1:03:25]
对 。 开始造轮子 。

**吴涛** [1:03:27]
对对对 。 所以这才导致很多时候这个 LF-CR 和 CRLF 和 LF-CR 在 GUI 上的结果基本是一致的 。 但是可能它们背后的这个 ， 呃 ，application 需要去处理你输入的这个控制符的东西 。

**Rio** [1:03:44]
嗯 。 嗯 。 呃 ， 像各种 ， 呃 ， 控制符号原来就后来变成转码嘛 ， 转成 ASCII， 然后最后转到 Unicode 吧 。 现在所以 Unicode 的话 ， 呃 ，LF 换行的话是码位是 0A， 然后 CR 回车的话是 0D。

然后呢 ， 它们还专门有一个码位 ， 就是 CR 加 LF。 嗯 。Unicode 好像是有 ， 嗯 ， 反正它们为了各种动作 ， 它们都有分的 。

好多控制符啊 ，其实在 Unicode 里面就沿袭了以前就各个系统 ， 操作系统 ， 它们还有什么分行啊 ， 分段啊 ， 还有垂直的挪行啊 ， 这样子都有的 。

**吴涛** [1:04:29]
这个因为主要是因为 Unicode 一开始的最开始这 256 个码位不都是跟那个 ASCII 一样的嘛 ？ 然后 ASCII 本身 。

**Rio** [1:04:36]
就是沿袭 。 嗯 。

**吴涛** [1:04:37]
就是从电传打字机时代定下来的一大堆有可能被需要的东西 。

**Rio** [1:04:42]
嗯 。 所以现在这些控制字符现在还有用吗 ？ 好像没有用了吧 。

**吴涛** [1:04:46]
没有用吧 。 那个到什么还有挪半行啊什么的 。

对啊 ， 它有往下挪半行 ， 往上挪半行 。

**Rio** [1:04:56]
就比如说像 ASCII 下面那些 D 的那个 ， 就是比如说就是 ， 呃 ， 多少 ， 就是小于 20 的那几个 ， 呃 ， 那几个控制符 ， 好像基本上现在日常都就没有用了 。

**吴涛** [1:05:08]
没用了呀 。

**Rio** [1:05:08]
没用了 。

**吴涛** [1:05:10]
小于 20 的控制符每天都在网络里面被使用吧 ？ 就是在 HTTP 协议里面被使用 。 那个是 ACK acknowledge，不就是一个 ACK 是多少 ？007 啊还是多少 ？

**Rio** [1:05:26]
你是说那个 ， 这个在哪里有用 ？ 没有啊 。

**吴涛** [1:05:29]
ACK 是 6 号 ，006。

**Rio** [1:05:33]
不 ，在你说在哪里有用呢 ？ 没有用啊 。

**吴涛** [1:05:35]
TCP 协议里啊 ， 三次握手啊 。

**Rio** [1:05:38]
嗯 。 啊 ， 你说那个里面它就用这个符号是吧 ？

**吴涛** [1:05:41]
对 。

**Rio** [1:05:41]
完全意思是我 。

**吴涛** [1:05:43]
意思是完全不一样 。

**Rio** [1:05:44]
意思是我 ， 呃 ， 我收到 ， 我收到了 ， 对吧 ？

**吴涛** [1:05:47]
嗯 。

**Rio** [1:05:48]
OK。

**吴涛** [1:05:49]
不是 ， 就是你看 ASCII 这个玩意儿 ， 它本身 ASCII 后面那个两个 I 代表什么 ？Information Interchange， 对吧 ？ 然后这些东西每一个符号都有 ， 都有其内在的 information 在里面 ， 只不过这些 information 可能对于人类 ， 就是前 20 的 information 对于人类没什么 ， 没什么可以直接看到的意义 ， 对吧 ？

但它本身还是一种 ， 还是在传递某种可能是非视觉上的信息 。 当然我相信就是 ASCII 里面有什么 device control 之类的 ， 这个是真正意义上的 ， 就不知道有谁 ， 现在还有谁在用呢 。

但是其他的像什么 ， 呃 ， 呃 ，end of text， 或者是 。

**Rio** [1:06:31]
大家都在用吧 。

**吴涛** [1:06:32]
对吧 ？

**Rio** [1:06:32]
像比如很简单的 000 号吧 ， 就是 null 嘛 ， 对吧 ？ 就空嘛 。 这空其实在还是 ， 对吧 ？ 空也是一个信息嘛 。

这个是一个空位 。

**吴涛** [1:06:42]
这个空用的比较多是在那个 C 的字符串作为那个串末的一个标记嘛 。

**Rio** [1:06:48]
对吧 ？ 嗯 。 这个 ， 这个 ， 虽然你是空 ，但是这也是一个 ，也是一个信息嘛 ， 对吧 ？ 它这样有个码位的呀 。

**吴涛** [1:06:56]
但是这个设计是非常糟糕的 。

**Rio** [1:06:59]
你要讲那个吗 ？

**吴涛** [1:07:01]
导致后面各种问题 。

**Rio** [1:07:03]
就是因为你每次你要找那个字符串的边界 ， 你必须把字符串数一遍 。

**吴涛** [1:07:08]
就会导致很多什么 overflow 的问题嘛 。

**Rio** [1:07:10]
对 。 如果你不数的话 ， 就可能就看到奇怪的东西 。

**吴涛** [1:07:15]
所以现在很多高级一点的语言都会把那个字符串的长度作为那个结构体的一部分放在里面 ， 就不用说大家再去找那个末尾到底在哪了 。

**Rio** [1:07:25]
嗯 。

**吴涛** [1:07:26]
嗯 。

**Rio** [1:07:28]
还有像 ， 呃 ， 我看看这里还有个 7 号 ， 这个 bell 啊 ， 叮 。

**吴涛** [1:07:33]
它会叫一声 。

**Rio** [1:07:34]
对 ，bell 会叫一声 ， 叮 。

**吴涛** [1:07:37]
挺有意思的 。

**Rio** [1:07:38]
嗯 。 好吧 ， 估计听到这时候我们自弹自唱的那些听众朋友都要睡着了 。

**吴涛** [1:07:45]
到底在说什么 。

**Rio** [1:07:48]
对 。 其实而且我们刚才说那么多 ， 都还是在这个纯文本的一个语境下说的 ， 对吧 ？ 如果到副文本了 ， 完全就不是这么回事了 。

### 软硬回车

**吴涛** [1:07:57]
副文本里面至少就是大家比如说在平时的那个文字处理的话 ， 要 ， 呃 ， 要经常处理就是一个强制换行和普通换行吧 ， 对吧 ？

**Rio** [1:08:08]
嗯 。 对 。 所谓的什么软回车 、 硬回车之类的 。

**吴涛** [1:08:12]
对对对 。 今天既然讲回车了 ， 我们就把这个跟大家顺便说一遍 。 什么叫硬回车 ？ 什么叫软回车 ？

**Rio** [1:08:20]
OK。 我还不知道这个概念有什么区别 。

**吴涛** [1:08:24]
来 ， 吴涛来讲吧 。

**Rio** [1:08:27]
啊 ， 我这个要我来讲 。

**吴涛** [1:08:29]
哈哈哈 。

**Rio** [1:08:32]
呃 ， 软回车 ， 我觉得这其实就换行 、 强制换行更多的接近于一个 ， 呃 ，typography，而不是 ， 嗯 。

**吴涛** [1:08:45]
对呀 。

**Rio** [1:08:46]
计算机文本上面的这样一个区别吧 。

**吴涛** [1:08:51]
是的呀 。 但是我们不是串台节目 ， 你要也要讲讲 typography 的东西啊 。

**Rio** [1:08:55]
OK。 嗯 。 我刚才太 technical 了 ，有可能一时没有回过味儿来 。 就是你在换行的时候 ， 实际上是 ， 就是换行是相当于一个 carriage return， 然后代表换行的这个段落的 ， 或者说换行的语义是产生一个新的段落 。

呃 ，而所谓的强制回车则是说这个段落其实没有结束 ， 只不过出于某种视觉效果 ， 或者是出于某种 ， 呃 ， 渲染上面的 ， 或者出于某种 ， 啊 ， 什么来着 ， 呈现上面的需要 ， 我需要在这里新起一行 。

对 ， 比如说在 。

**吴涛** [1:09:36]
你说 line break 吗 ？

**Rio** [1:09:37]
对 。

**吴涛** [1:09:38]
OK。

**Rio** [1:09:39]
嗯 。

**吴涛** [1:09:39]
对 。

**Rio** [1:09:40]
不 ，line break 是一个 ，line break 是一个技术上的 term，而换行和强制换行则是 line break 有可能产生的两个语义 。 而 ， 呃 ， 换行所产生的是一个新的段落 ， 然后， 呃 ， 强制换行产生的只是新的一行而已 。

**吴涛** [1:10:02]
嗯 。 所以如果在一般的那个 ， 比如说 Word 这个文字处理软件 ， 或者像比如 Mac 的话是用 Pages 嘛 。 如果你普通换 ， 呃 ， 你按下那个所谓的 return 回车键 ， 你按下去以后， 它会产生一个新的段落 。

所以它会在原来的那个段 ， 呃 ， 那一行的末尾加 ，其实它会加一个段落符号啦 ， 就平时是看不见的 。

你可以打开来把那个控制符号打开来 ， 它显示的话就看见这是一个段落的结束 。 所以呢 ， 它前面是一个段落符号 。

而如果你硬要在这个段落并没有结束 ，但是硬要换行的话呢 ， 它是可以换行的 。 那这时候呢 ， 比如说 ， 呃 ，在 Word 里面是 Shift + Enter。

**Rio** [1:10:45]
很多地方都是 。

**吴涛** [1:10:47]
Pages 也是 。 你按 Shift 然后再按一下 Enter， 它会强制再换一个行 。 那这个时候如果你打开那个控制符号 ， 你会发现它这时候是这个段落没有结束 ， 所以它不会加段落符号 ，而就是单纯加一个回车的一个返回的一个符号 。

**Rio** [1:11:04]
啊 ， 我想起来了 。 就这里会受那个行间距的影响 ， 对吧 ？ 如果是强制 ， 就是段落类的强制换行 ， 它是不会受行间距影响产生视觉的那个 。

**吴涛** [1:11:13]
不会受段间距 。

**Rio** [1:11:14]
段落间距 。

**吴涛** [1:11:15]
段间距 。

**Rio** [1:11:15]
段落间距 。

**吴涛** [1:11:16]
对 ， 段间距的影响 。 对对 。

**Rio** [1:11:18]
嗯 。

**吴涛** [1:11:18]
因为逻辑上的话 ， 对啊 ， 它还是同一个段落 ， 它就不会在这里加间距嘛 。

**Rio** [1:11:23]
就这也是那个 HTML 里面那个 P 和那个 BR 这两个标签的区别嘛 。

**吴涛** [1:11:29]
嗯 。

**Rio** [1:11:29]
对对对 。 所以呢 ， 又说回来 。 对啊 ， 我都写着呢 。

**吴涛** [1:11:34]
啊 ， 对对对 。

**Rio** [1:11:35]
嗯 。

**吴涛** [1:11:36]
对 。 不过其实我们这里 ， 呃 ， 作为这个 typography 的这一方面 ， 我们其实还有一些需要补充的 ， 就是大家可能需要意识到 ， 分段和换行其实是完全两种层面的概念 ， 或者说是意义 。

对 ， 比如说那个 ， 我们现在 ， 或者说已经过去很长一段时间之内 ， 我们都已经默认了换行是要产生一个新段落的 ， 或者说产生一个新段落的一个必要条件 ， 就是必须要换行的 。

那么但是在更早期的时候 ， 这个事情就不那么一定了 。 比如我们如果听过我们上一期自弹自唱节目的听众 ， 可能还记得伟大人民艺术家 Eric Gill，他就喜欢在这个段落之内换行的 。

啊 ， 段落之内分段 。 就我们现在所谓这个视觉段落之内 ，他可以随意地插入所谓的这个分段符 。

所以就是他分段的方式有很多 。他可能分段不换行 ，他也可能分段又换行 ，他也可以分段又换行又空行 。

**Rio** [1:12:32]
嗯 。

就中 。

**吴涛** [1:12:35]
就 pilcrow，pilcrow 这个符号在早期羊皮卷上是比较有用的嘛 。 因为羊皮卷做一张纸你不容易 ， 然后如果你只是想要写一张内容的话呢 ， 这你可以把一整张弄成就是视觉上的一段 ， 然后而真正上， 真正的一段你可以用 pilcrow 在这个章节里面把它隔开就好了 。

**Rio** [1:12:59]
就有这个 ， 就是段落回车符这个东西 ， 对吧 ？ 这个东西叫这个 ，其实就是标点符号嘛 ， 把它变成 。

**吴涛** [1:13:06]
对对对 。pilcrow 就是叫段落回车符 。

**Rio** [1:13:09]
就以前我们比如说那个句号是分句嘛 ， 然后这个逗号是分句里面的一个单位 。 那如果说段与段之间我们可以插入这个符号来解决这个问题 ，也可以节省这个空间 ，不用 ， 呃 ，不用换 ， 真的换一个行然后空一行这样 。

**吴涛** [1:13:23]
对 ，是的是的 。

**Rio** [1:13:27]
哎 ， 还有那个以前 ， 就是还有这个 ， 这个跟 indentation 也有关系嘛 ， 对吧 ？ 就是首行缩进那个东西 。

**吴涛** [1:13:35]
是的 。 缩进最早也是用来替换这个 pilcrow。

**Rio** [1:13:38]
就它也是一个标志性的一个 ， 一个 ， 一个符号 。 但是为了省纸的话 ， 就是羊皮纸很贵 ， 对吧 ？ 毕竟羊皮很贵嘛 。

那我们就不要缩进了 ，也不要换行了 ， 就直接插一个这个符号 ， 中间大家知道 ， 就是下一段开始就行了 。

**吴涛** [1:13:55]
跟大家在 ， 呃 ， 可能有第一次听我们节目的听众 ， 我们给大家再一次解释一下 。 刚才三位主播都说了这个 pilcrow，pilcrow 是什么东西 ？

它的通常说法是 paragraph mark， 就是段落记号 。 它长得呢是像一个左 ， 镜像反向的一个字母 P， 然后又加一竖的一个那个控制符号 。

如果大家把这个常见在 ， 比如说在 Word 里面的控制符号如果给它打开的话 ， 会发现每个段落后面它就会显示这样一个段落符号 。

这个段落符号英文叫 pilcrow。

**Rio** [1:14:31]
对 。

**吴涛** [1:14:33]
所以其实就是说 ， 呃 ， 换行和分段 ， 呃 ， 这个概念呢在 typography 里面其实还是有一点绕的 。 就我们现在可能更常见的是看到了这个分段一定是带来换行这个操作 ， 然后我们也会默认说换行多数时候是用来分段 。

那么偶尔通过软回车这种方式 ， 我们可以令得这个 ， 呃 ， 它分 ， 换行但是不分段 。 那么在更早的一些时候呢 ， 我们会发现分段这个操作跟换不换行完全没有关系 。

它是一种更加自由 。

**Rio** [1:15:08]
它那个逻辑 ， 逻辑概念嘛 。 然后换行其实是一个样式 。

**吴涛** [1:15:13]
是的是的 。 然后还有这个中文里面还有一个缩进两个字的样式 ， 对吧 ？ 哦不 。

**Rio** [1:15:20]
对对对 。

**吴涛** [1:15:21]
对 。 还有缩进和加一个空行的这个样式上的差别 。

**Rio** [1:15:27]
所以这个样式到是随着这个媒体的变化而变化的 。 像比如说以前羊皮纸很贵嘛 ， 所以我尽量要节约空间 ， 那我只要插这个 ， 呃 ， 这个段落符号就可以了 。

可是到了后来呢 ， 就发现在有了纸张 ，有纸张相对廉价了 ， 那我们就可以换行了 ， 或者我们可以不缩进也可以 ， 对吧 ？

但是呢 ， 这中文习惯我还可以空两格 。 空不空 ， 只要是你的 ， 主要目的就是让读者知道你这个是新的一段的开始 ， 对吧 ？

这是不同的 ， 呃 ， 风格问题 。 那到了现在网页的话 ， 网页反正现在你随便滚屏可以随便往下滚嘛 。

因此呢 ， 大家就更偏向就是用段落间距来区分段落 ，而不是用段落缩进来区分段落 。 这个都是视觉上的不同的变化 。

而这种 ， 这种风格化的变化和你这个媒介是有很大的关系的 。

**吴涛** [1:16:23]
嗯 。其实这个缩进 ， 呃 ，有一种传说说它其实就是因为 ， 呃 ， 早期一些牌子在排 pilcrow 的时候忘记放这个字符进去了 ， 所以产生了一个空间 。

大家发现这个空间也可以区分段落 ， 所以渐渐的就不再用 pilcrow 了 。

**Rio** [1:16:40]
就 pilcrow，不够用了嘛 。

**吴涛** [1:16:42]
没有 。 以前的话就是比如说你是写 ， 呃 ，在写白纸黑字是黑色的嘛 ，但是这个 pilcrow 它可能要用红色另外标 。

所以在排字的时候 ， 它是在排黑板的时候呢 ， 就黑颜色的那块板子的时候呢 ， 它 pilcrow 这个都是空出来的 。

**Rio** [1:16:59]
就叫套印才可以是吧 ？

**吴涛** [1:17:01]
对对对 。

**Rio** [1:17:02]
对对对 。 因为它要用红色另外去套上去嘛 ， 或者用手写 ， 或者要用有个美工师傅去画一个很漂亮的画 ， 都可能 。

嗯 。 所以呢 ， 段落开始呢 ， 它在排字的时候都是会空出来的 。 嗯 。 这个是这个段落缩进的起源 。

**吴涛** [1:17:18]
啊 ， 终于搞清楚这几个之间的相互关系了 。

**Rio** [1:17:21]
不管怎么样 ， 反正最终的目的就是要让读者知道啊 ， 这是一个新的段落 。 那实际上呢 ， 做法有各种各样的 ， 对吧 ？

**吴涛** [1:17:29]
对 。

**Rio** [1:17:29]
嗯 。其实在网页上面的话 ， 现在更多的流行大家都是希望加一整个空行嘛 ， 对吧 ？ 现在反正屏你可以随便乱滚嘛 。

那在 HTML 里面大家就加那个 P 元素的话 ， 对吧 ？ 然后再去针对这个 P 元素再进行 CSS 上面的控制 。

那但是有时候呢 ， 还是喜欢在一个段落里面需要强制断行 ， 那你就加一个那个 break 嘛 ，BR /， 对吧 ？

**吴涛** [1:17:57]
就这个在应该是诗歌什么里面用的比较多 ， 对吧 ？

**Rio** [1:18:02]
嗯 。

**吴涛** [1:18:02]
嗯 。 它需要换行 ，但是它并不是一个段落的结束嘛 。

**Rio** [1:18:07]
对对 。

**吴涛** [1:18:07]
嗯 。

**Rio** [1:18:07]
为了样式的好看的时候 。

**吴涛** [1:18:10]
嗯嗯嗯 。

**Rio** [1:18:16]
后面那个语言里面那个你们要讲吗 ？

### 编程之困

**吴涛** [1:18:19]
我觉得没什么必要啊 。 就 ， 呃 ，而且好像你确定这个回车在不同语言里面所谓使用 ， 比如说使用 carriage return 的意思是什么呢 ？

就这个使用指的是它内部存储的方法还是 ， 还是什么呢 ？

**Rio** [1:18:42]
你指的是什么 ？ 是 C 里面还是 ？

**吴涛** [1:18:44]
嗯 。 就比如说你在 Python 里面 ， 呃 ， 你说比如说 Python 语言使用 carriage return 这句话的意义是什么呢 ？ 就是是指 Python 的源代码一定是用 ， 必须使用 carriage return， 还是说 Python 在内部 ， 呃 ， 保留字符串的 ， 存储字符串的时候使用的是 carriage return？

还是 ？

**Rio** [1:19:07]
应该是后者 。

**吴涛** [1:19:08]
不是 ，Python 是这样的 。Python 它根据平台的不同 ， 它有不同的行为模式 。 比如说这个 ， 呃 。

**Rio** [1:19:16]
对啊 。

**吴涛** [1:19:16]
Python 有个含义说叫做 print， 对吧 ？

**Rio** [1:19:19]
对 。

**吴涛** [1:19:20]
嗯 。print 它打印完之后， 呃 ，在 Windows 下面它会打那个 ， 就是 CRLF， 就是 carriage return， 然后 new line。 然后在 Unix 里面它就只会打这个 new line 去换行 。

**Rio** [1:19:36]
嗯 。

**吴涛** [1:19:36]
对 。 所以就是这个使用 ， 呃 ， 某个语言使用 backslash r 的意思指的是什么呢 ？ 就是 ， 呃 ， 它因为其实不只是 Python， 就很多语言都是这样的 。

你在 ， 你让它输入 ， 你在不同的平台下输出什么东西 ， 它很有可能是平台相关的 。 但是它内部所存储字符串或者存储某一个格式化信息的时候 ， 可能的确会用某一种单独的字符 。

就比如说 ， 呃 ， 最 ， 就很让我头疼的一个 ， 曾经很让我头疼的一个问题就是 ， 呃 ，Git 在 ， 呃 ， 存储源代码的时候 ， 你可以设置它存储的那个源代码的新换行符应该是 Windows 的还是 Unix 的 。

然后如果你和一个使用 Windows 的人， 呃 ， 使用了不同的设置 ， 然后他 commit 进来的代码 ， 每一个行尾都被替换成了 CRLF。

然后当你 checkout 的时候 ， 对 ， 它就会 ， 它不一定会加上去 ， 就是你可以设置它的具体的 behavior。 然后有时候会导致说你明明什么也没做 ， 你只是 checkout 的代码 ， 然后 Git 会告诉你所有代码都已经被更新了 。

但是当你想要把这个更新存储下来的时候 ， 却又怎么都存不下来 。

**Rio** [1:21:04]
嗯 。

**吴涛** [1:21:05]
对 。 所以 。

**Rio** [1:21:06]
这个行为很像 ， 呃 ， 就是像我后面那个 ， 呃 ，Windows 记事本的那个 ， 那个梗 。

**吴涛** [1:21:13]
OK。 说说看好了 。

**Rio** [1:21:16]
就是至少在 XP 上是这个动作 。 就是在 Windows 记事本 ， 呃 ，Windows 记事本它的格式菜单里面啊 ，有个右端自动换行的一个选项 。

所以呢 ， 如果你选项以后你改变窗口的宽度以后， 它那个 ， 它会自动折行 。

**吴涛** [1:21:36]
OK。

**Rio** [1:21:37]
嗯 。 然后但是一旦另存为 ， 成为那个纯文本文件 ，TXT 文件以后， 然后在那个当前那个状态的右侧的每一行就会被加入那个换行符 。

这样呢 ， 无论你改怎么样改变了窗口大小 ， 就不会自动折行了 ， 就失效了就 。

**吴涛** [1:22:00]
就它手工折行了嘛 ， 所谓的 。

**Rio** [1:22:03]
对对 。 你一旦你保存了以后， 它就手工折行了 。

**吴涛** [1:22:06]
对对对 。

**Rio** [1:22:07]
嗯 。 然后呢 ， 呃 ， 这个状态 ， 这个特别扯 。 这个状态下如果哈 ， 你 ， 呃 ， 你把这个粘贴复制哈 ， 你拿到其他的那个文本编辑器里去看 ，其实啊 ， 就是 ， 呃 ， 这个记事本它手工加入了那个 CRCRLF， 一个特别怪的一个码 。

就是回两次车加换行 。 然后这时候你 ， 然后你记事本就保持这个打开的状态 。 然后呢 ， 就原来 ， 呃 ， 你在那个 TXT 文件里还在嘛 ， 你用其他的那个文件编辑器打开来看 ， 就发现却没有这个换行符 。

也就是说这个奇怪的换行符啊 ， 就没有写到那个文件里面去 。

**吴涛** [1:22:53]
它只是写在那个它的那个进程里面 ， 那个 buffer 里面这样实现了这个 。

**Rio** [1:22:58]
对 。 只对它自己有用 。 对 ， 只对它自己有用 。 你用其他的那个文本编辑器是看不见的 。 好 。 这时候你再回来 ， 你又回到这记事本 ， 你再保存 ， 保存以后再按全选 。

你一按全选的时候呢 ， 它呢又可以恢复那个右 ， 呃 ， 右端自动换行 ， 改变出来随意窗口大小又开始折行 。

就特别奇怪 ， 会跳来跳去的 。 就是因为它那个 Windows 记事本它自动加了 ， 加了一个为了它显示的方便嘛 ， 实现它这个折行的问题 ， 加了一个特别奇怪的 CRCRLF。

**吴涛** [1:23:40]
这个记事本真的临时给我们开发的吧 。

**Rio** [1:23:43]
啊 ，不过好像其实还是有一些这个传统的这种纯文本编辑器 ， 它会有两种模式嘛 。 就是一种是 soft wrap， 一种是 hard wrap。hard wrap 就相当于帮你强制断掉行之后插入这个换行符 。

然后 soft wrap 它可能是不插入新的字符了 。 但是 Windows 这个记事本就是在某一种模式下， 这个 silently 的给你插入了这个换行符 。

**吴涛** [1:24:09]
但你插进去是没有关系的 。 而且呢 ， 就是说它临时插完 ， 它保存以后， 它有时候它又给 ， 它会 ， 它是自动插了以后， 它保存了还会把它删掉 。

**Rio** [1:24:20]
不 ， 记事本这个问题看起来就是它用那个就是 hard wrap 的方式实现了这个 soft wrap。

**吴涛** [1:24:27]
对 。

**Rio** [1:24:28]
就因为它 ， 它本身那个程序可能不支持 soft wrap 的这种设计 。

**吴涛** [1:24:34]
它只是一个记事本啊 。

反过来它干嘛要用一个这么奇怪的 。

**Rio** [1:24:43]
就是 hack 嘛 ， 就是为了实现 ， 实现简单嘛 ，不用重新写 。 因为 soft wrap 的话其实你要额外做事情嘛 ， 你要把这个两个概念抽象出来嘛 ， 对吧 ？

它说那不用啊 ， 我就直接这么实现这个概念就好了 。

**吴涛** [1:24:56]
嗯 。

**Rio** [1:24:59]
所以就经常 ， 经常就会我在 Windows 上记事本写东西嘛 ， 然后给它 ， 呃 ， 复制粘贴到其他东西去 ，其他地方去的话 ， 就其实它就会这时候就把多余的那个莫名其妙的 CRCRLF 这个换行符也一起拷贝过去了 。

然后就特别特别坑 。 就是你本来这个 ，因为这个纯文本就特别特别脏了嘛 。

**吴涛** [1:25:23]
你为什么要用记事本 ？

**Rio** [1:25:25]
对啊 。 就是我不用记事本 ，但是当你把你的东西发给别人的时候 ， 或者怎么样的时候 ， 就经常会出这个事情嘛 。

**吴涛** [1:25:32]
所以这个系统自带的这种软件啊 ， 一定还是要做好 ，不要留一些这种很明显的坑的吧 。 因为大家默认是用这个吧 。

**Rio** [1:25:41]
对啊 。 而且现在在 ，而且做的记事本 ， 一般 Windows 用户就觉得好像这个记事本就几乎不能 ， 什么功能都没有嘛 ， 就什么都不能做嘛 。

### 编辑器

**Rio** [1:25:53]
然后习惯 Windows 的人， 然后再转到 Mac 平台上， 就觉得好像 Mac 平台上这个文本编辑 ， 这个 TextEdit 好像也是什么都不能做的 。

但是呢 ， 反过来其实 Mac 上文本编辑可以做很多很多事情 。

**吴涛** [1:26:06]
它其实是个 rich text editor。

**Rio** [1:26:08]
对啊 。 我觉得一开始最让我不爽的一点 ， 或者说最不习惯的一点 ， 最 culture shock 的一点就是 Mac 平台上面新建一个文本文件居然默认是 rich text。

**吴涛** [1:26:19]
啊 ， 对 。

**Rio** [1:26:20]
对 。 因为其实我小时候写了很多 ， 就我小时候写东西基本上都是用记事本 。 就几乎 ，因为就是因为它几乎什么功能都没有 ， 所以我一直都用它 。

然后刚用 Mac 的时候我想 ， 我靠 ， 为什么我只想写点东西 ， 然后还让我可以调整字号什么的 ， 这何必呢 ？

**吴涛** [1:26:40]
不 ， 这个刚好关联 macOS 这个经验的地方啊 。

**Rio** [1:26:45]
嗯 。 至少直到今天我还是会把那个 TextEdit 的默认新打开的文件设成纯文本 。

**吴涛** [1:26:53]
纯文本是吧 。

**Rio** [1:26:54]
可能是 。 对 。

**吴涛** [1:26:56]
但是我就发现你从其他网页上粘贴的东西 ， 它又变成了 full 文本 。

**Rio** [1:27:01]
啊 。

**吴涛** [1:27:02]
会这样吗 ？

**Rio** [1:27:03]
好像是会这样的 。 所以我从来不用那个破玩意儿 。

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

**Rio** [1:27:09]
啊 ， 你不用 ， 你不用 Mac 上面的文本编辑吗 ？ 偶尔也用 。

**吴涛** [1:27:14]
不用啊 ， 从来不用 。

**Rio** [1:27:16]
我几乎不用吧 。 就除了偶尔贴个什么东西之外， 几乎从来不用 TextEdit。

**吴涛** [1:27:23]
啊 ， 贴的话也不用 ，其实也没有必要用 ， 对吧 ？ 那好 。 那平时你们用什么 ， 就是文本编辑器啊 ？

**Rio** [1:27:31]
程序员用的那种呗 。

**吴涛** [1:27:33]
对啊 。

**Rio** [1:27:34]
对啊 。 如果 ， 就如果要写程序的话就用 Vim。 然后不写程序的话 ， 什么 Sublime 啊 ， 什么 ， 嗯 。

**吴涛** [1:27:42]
不写程序用 Sublime。 好多程序员其实 。

**Rio** [1:27:45]
不写程序 ， 用 Sublime 也挺好的 。 然后我再用一个日本人写的 ， 叫做 CotEditor，COT Editor。

**吴涛** [1:27:53]
对 ， 这我们在节目里提过 。

**Rio** [1:27:55]
啊 。

**吴涛** [1:27:56]
对对对 ， 当时好像用那个 。 好用吗那个 ？

**Rio** [1:27:59]
据说很好用 。

**吴涛** [1:28:01]
而且它原生支持竖排 。

**Rio** [1:28:05]
日本人做的嘛 。

**吴涛** [1:28:06]
对 。其实那个 Mac 的默认的那个文本编辑也可以支持竖排 。

**Rio** [1:28:14]
呃 ，OK。 不过这个它附带代码高亮 ， 所以编辑 ID 的话 。

**吴涛** [1:28:22]
没有必要 。

**Rio** [1:28:22]
不是 ，Markdown 也需要代码高亮 ，也可以用代码高亮的呀 ，并不是说你一定要写 ， 呃 ， 程序才需要代码高亮 。

**吴涛** [1:28:31]
啊 ， 那也是 。

**Rio** [1:28:34]
然后它可以根据 Markdown 的那个结构自动生成一个 outline。

**吴涛** [1:28:40]
哦 。

**Rio** [1:28:40]
就 ， 对 ， 这还蛮不错的 。

**吴涛** [1:28:45]
哎 ， 我记得那个我们的那个朋友江江 ，他好像做过一个这个 TextEdit 的改良版 ， 对吧 ？ 因为 Windows 下面有 ，Windows 下面有那个 Notepad++ 嘛 ，是吧 ？

**Rio** [1:28:58]
嗯 。

**吴涛** [1:28:59]
然后他 ， 江江也做了一个 TextEdit 加 ， 叫做 TextEdit+ 吧 ， 应该是 ， 如果我没记错的话 。

**Rio** [1:29:05]
这个项目还在维护吗 ？

**吴涛** [1:29:07]
很久很久以前的事情了 。

**Rio** [1:29:09]
对 ， 我记得这个项目有几个非常非常实用的特性 。 首先它能自动识别编码 。 对 ， 然后好像它对这个 BOM 有一个特殊的处理 ， 就是防止这个 BOM 不兼容的问题 。

**吴涛** [1:29:20]
就是为了解决那个初用这个 Mac 的用户要跟这个 Windows 用那个记事本编辑的文本之间 ， 呃 ， 这个协同的问题嘛 。

**Rio** [1:29:31]
对 。 另外它还有个很伟大的地方 ， 就是它好像在某几个 OS X 的版本里面能修复那个输入中英文的时候光标上下跳动的那个问题 。

**吴涛** [1:29:42]
啊 。 哇 ， 这个是好古老的历史了 。

**Rio** [1:29:46]
对 ， 这真是好古老的一个 bug 啊 ， 我靠 。

**吴涛** [1:29:49]
但这个曾经是非常困扰中文用户的 。

**Rio** [1:29:53]
是的 ，是的 ， 对 。 没错 。

**吴涛** [1:29:55]
那个原来其实是那个 CoreText 的 bug 吧 ？

**Rio** [1:29:59]
对 ， 应该是不同字体 ， 它默认设的某一个跟行高相关的数值 ， 然后不一致 。 对对对 。

**吴涛** [1:30:06]
有可能 。 经常会出现那个行高跳来跳去 ， 然后搞不定 。

**Rio** [1:30:10]
那个 bounding box 的设置 。 嗯嗯 。

**吴涛** [1:30:13]
天哪 。其实现在我们用的那些像 Vim 啊 ， 那些稍微高级一点的这种程序员的文本编辑器都可以是设置自动探测这个换行 ， 到底是 CRLF 还是 LF， 还可以探测这个编码 ， 还有包括 ， 哎 ， 好像还有一个是什么 ？

**Rio** [1:30:32]
就是至少你这个高级的编辑器 ， 它会给你有选项 。 嗯 。

**吴涛** [1:30:36]
哎 ， 吴涛 ，Vim 的那个 FF 那个选项是设置什么来着 ？ 我现在想不起来了 。

**Rio** [1:30:42]
FF， 换行 ， 呃 ， 换 。

**吴涛** [1:30:44]
File format 那个选项是设置什么 ？ 好像就是设置 CRFLF。

**Rio** [1:30:48]
呃 ， 它是 ， 它是一个 cluster setting， 就是 ， 呃 ， 除了换行 ， 还会设置语法 ， 呃 。

**吴涛** [1:30:58]
不是不是 ，file format 应该只是涉及它只会显示 Unix 还是 DOS 嘛 。 好像就是只是设置这个换行的 ， 到底是用 CRFLF。

**Rio** [1:31:07]
我想的是 file。OK。 有可能 。

**吴涛** [1:31:10]
对 ， 如果我没记错的话是这样子的 。 然后好像还有一个就是之前说的 ， 就那几个 ，因为有两个字符嘛 ， 就有那种四种组合嘛 ， 刚才之前也提过 ， 就是单的 CR， 单的 LF， 然后 CRFLF， 还有 LFCR 嘛 。

**Rio** [1:31:23]
嗯嗯 。

**吴涛** [1:31:24]
当时就设置这 ， 好像但是只有三种 ， 我记得 ，有 Unix，有 DOS。

**Rio** [1:31:29]
有 DOS 和 Mac。

**吴涛** [1:31:31]
对 ，Mac 就是指的是 Mac OS 9 和以前的那个纯用一个 CR 来表示换行的 。 然后 Unix 就是 LF 来表示换行的 ， 然后 DOS 就是 CRF 表示换行的 。

然后那个怪胎的 LFCR 是没有人用的 。

**Rio** [1:31:46]
嗯 。

**吴涛** [1:31:47]
对对 ， 没错 。 就是老版的 ， 就是所谓的 classic 的 Mac OS， 就是直到版本 9 以前 ， 它能换行都是用 CR。

**Rio** [1:31:55]
9 也是好像 。

**吴涛** [1:31:56]
嗯 ， 对 ， 直到 9。

**Rio** [1:31:58]
直到 OS X 之前都是这样 。

**吴涛** [1:32:00]
OS X 它就是其实 ， 对吧 ？ 它是一个 Unix， 薄这个皮 。

**Rio** [1:32:05]
对对对 。

**吴涛** [1:32:05]
所以它变成 OS X 以后， 它就符合 Unix 的动作 ， 就给它换成 LF 了 。 所以当年就是老 Mac 换成新 Mac 的时候也是有好多问题 。

### 网络协议

**Rio** [1:32:18]
对 。 刚才说到一个那个协议的问题 ， 刚才还补充一个事儿 ， 就是刚才不是提到过那个 ， 比如说 HTTP 协议里面的那个换行应该是默认是标准规定方式 CRFLF 嘛 ， 就是 DOS 那套方式嘛 。

**吴涛** [1:32:31]
嗯 。

**Rio** [1:32:32]
但其实那个规范里面后面有一行小字又说 ， 为了最大的兼容性 ， 就是如果你是生成这个 HTTP 协议的那个文本呢 ， 你要用那个 CRF。

但是如果你是接收这个协议的 ， 为了向后兼容那些奇奇怪怪的客户端 ， 你只要看到 LF 就能换行就可以了 。

**吴涛** [1:32:53]
说是一回事 ， 做又是另一回事 。

**Rio** [1:32:56]
就是有一个哲学嘛 ， 就是就对自己要严格一些 ， 对别人要宽容一些 。

**吴涛** [1:33:01]
对啊 ， 对啊 。 所以就是越搞了半天 ， 那个底线就会越划越低嘛 ， 就是要不然的话都不行 。

**Rio** [1:33:08]
嗯 。

**吴涛** [1:33:10]
像那个网络协议 FTP 的话 ，也是由于系统不一致的话 ，有时候一开始也会传单传文本文件也会有问题嘛 。

所以呢 ， 就是要明确两个 ， 它是以 ASCII 就是文本模式在传 ， 还是以那个 binary 嘛 ， 就是真正在传代码嘛 ， 对吗 ？

**Rio** [1:33:29]
那个问题就 ， 那个问题就更麻烦了 ， 比这个事情还要搞那个分说 。

**吴涛** [1:33:33]
对啊 ， 那更底层了 。

**Rio** [1:33:34]
不 ， 那个是分 ，是这个问题导致 ， 它是所谓的一个 7 位还是 8 位的问题 。

**吴涛** [1:33:39]
哦 ，是 seven bit clean 还是 ？

**Rio** [1:33:41]
啊 ， 就对对对 。 就因为传统的这个电传 ， 它是在以前那个电报的那个基础上复用的嘛 。 然后那个时候为了就是 ， 电报那个是 7 位码嘛 ， 就是 ASCII 传统上是只有 128 个字符嘛 ， 对吧 ？

那有那个 extended mode 才是 ， 才变成 8 位 ，是 256 个字符嘛 。 所以在很多古早的这个通讯系统里面 ， 包括很多这个早期的邮件系统里面 ， 为什么要费那么大的纠结去 ， 比如说你现在我们去邮件发一个附件 ， 对吧 ？

它会有人把它变成一个 ， 用一个编码模式 ， 呃 ， 就是为了所谓的叫做 seven bit clean 嘛 ， 就是能够在很古老的那些通讯系统里面也可以用 ，因为它不支持一个字符是 8 个 bit 的这种情况 。

啊 ， 所以 。

**吴涛** [1:34:26]
占用 ， 占用最高位的 。

**Rio** [1:34:28]
对对对 。 所以我们很多这个 ， 呃 ， 邮件系统你传附件的时候 ， 它的那个 overhead 是很大的 ， 可能百分之二三十 ， 就是因为要重新采用一个编码 ， 本来现在现代计算机都是 8 位 ， 呃 ， 字符 ， 呃 ， 一个字节是 8 个 bit 嘛 ， 对吧 ？

**吴涛** [1:34:45]
嗯 。

**Rio** [1:34:46]
但是又为了考虑到像兼容一些古早的系统 ， 我们还是要把它变成 7 位的 ， 那就你看一下就要搞很多很奇怪的转译的事情 。

然后那个 FTP 的那个 ASCII 模式和 binary 模式就是分 ，ASCII 模式就是只有每个字节 7 位嘛 ， 然后 binary 就是可以传 8 个的 。其实 binary 是一个更加 ， 呃 ， 高效通用的一个方式 。

**吴涛** [1:35:09]
嗯嗯 。 不过反正现在各种 ， 呃 ， 现在的话 FTP 软件它都会帮你切换两个模式吧 ？ 这个都无所谓 。

**Rio** [1:35:18]
我是说现在谁还用 FTP？ 我很好奇 。

**吴涛** [1:35:22]
李如意 。

**Rio** [1:35:24]
哈哈哈哈 。

**吴涛** [1:35:26]
我们上传音频也是用 FTP 啊 。

**Rio** [1:35:28]
不会啊 ， 你们还是用 FTP 吗 ？

**吴涛** [1:35:31]
对啊 ， 就没有特别方便 ， 就是不需要太折腾的工具 。

**Rio** [1:35:36]
不 ，有那个啊 ，有那个 ， 呃 ， 呃 ， 那个叫什么 ， 呃 ， 哎 ， 哎 ， 吴涛那个 SSH 那个 S 叫什么 ？

**吴涛** [1:35:43]
SFTP。

**Rio** [1:35:45]
不是不是 ，SCP 传的是什么玩意儿 ？

**吴涛** [1:35:48]
SCP 是通过 SSH 来传输的 。

**Rio** [1:35:50]
对对 ， 就是 ， 就不用 F， 我的意思就不用 FTP 了嘛 。

**吴涛** [1:35:55]
呃 ， 这得看你的那个服务商是不是开放了这样的渠道 。

**Rio** [1:35:59]
不用不用 ， 你只要能够远程 。

**吴涛** [1:36:01]
你只要能 SSH 就可以 。 对 ，SSH 和 SFTP 差不多 。

**Rio** [1:36:05]
就反而你用 FTP 还要再装一个软件 ， 开一个端口 ，而且基本上是不安全的 。 所以我们目前所有的这个传输 ， 啊 ， 比如说 ， 比如说 IPN 的那个 ， 那个传音频文件上去 ， 都是不走 FTP 协议的 。

**吴涛** [1:36:19]
嗯嗯嗯 。 反正你这个 ， 啊 ， 好吧 。 的确 ，FTP 特别不安全嘛 。

**Rio** [1:36:26]
嗯嗯嗯 。 而且 FTP 那个还挺坑的 ， 它有 ， 我不知道你们知不知道哈 ，有一个叫 FTPS 和 SFTP。

**吴涛** [1:36:35]
对 ， 俩是不一样的东西 。

**Rio** [1:36:37]
完全不一样 。

**吴涛** [1:36:38]
啊 ， 好吧 。

**Rio** [1:36:41]
然后我们说那个 SCP 拷贝那个其实 SFTP， 它跟 FTP 其实并没有什么关系 。

非常坑爹 。

**吴涛** [1:36:51]
就是名称长得像而已 。

**Rio** [1:36:52]
哎 ， 等等等等 ， 好像 ， 好像不是 。 我想想 。 有三个 ， 对 ， 错了 ，有三个 。 有 SCP，有 SFTP， 还有 FTPS。

**吴涛** [1:37:03]
SCP 是基于什么 ？ 是 RCP 还是基于什么的协议嘛 ？ 然后 。

**Rio** [1:37:13]
SCP 就是 SSH 上面弄的嘛 。

**吴涛** [1:37:16]
是 ，但是不是 ， 它 ， 它 ，但它毕竟是一个文件传输协议啊 。

**Rio** [1:37:20]
啊 ， 对 。

**吴涛** [1:37:21]
它是基于这个 RCP 的 。

**Rio** [1:37:22]
对 。

**吴涛** [1:37:23]
对 。 然后 SFTP 应该是 ， 呃 ， 嗯 ，wait a second。

**Rio** [1:37:32]
就 SFTP 它既不是 FTP。

**吴涛** [1:37:36]
它是一个新协议 ， 跟这个没有关系 。

**Rio** [1:37:38]
对 ，SFTP 是完全一个 ， 嗯 ， 一个新的东西 。 对 。

**吴涛** [1:37:41]
对对对 。 对 ，SFTP 是基于 SSH 的 FTP，但它同时又不是 SCP。 是这样 。

**Rio** [1:37:49]
不 ， 它也不是 FTP。

**吴涛** [1:37:50]
不是 ，SFTP 的 ， 呃 ， 名字里面有 ， 呃 ，file transfer protocol 这个 ， 这个 ， 这个 。

**Rio** [1:37:59]
对 ，但是它跟那个 FTP 是完全是两个东西 。

**吴涛** [1:38:01]
嗯嗯 ， 对对对 。

**Rio** [1:38:03]
对 ，但是它跟 SCP 也不是同一个东西 。

**吴涛** [1:38:05]
对 ， 这不是一个乱吧 。

**Rio** [1:38:06]
嗯 ， 对 。

**吴涛** [1:38:07]
啊 。

**Rio** [1:38:07]
所以其实 ， 呃 ， 我当时学的时候反正是分开学的 ， 我也没把它混在一起 。 现在被你讲了反而 ， 哈哈哈哈 ， 本来不乱的被你搅乱了 ， 真是的 。

太烦了 。

**吴涛** [1:38:19]
对 ， 搞混了 。

**Rio** [1:38:21]
反正也就是你看 ， 跟 FTP 沾边的都不要用就对了 。

**吴涛** [1:38:25]
那还好吧 。

**Rio** [1:38:28]
这个是最安全的方法 。

**吴涛** [1:38:30]
最安全的方法 。

**Rio** [1:38:31]
FTP 比较粗暴嘛 。

**吴涛** [1:38:32]
对对对 。

**Rio** [1:38:34]
天哪 。

**吴涛** [1:38:35]
好吧 ， 那今天差不多就讲到这里了 。

### 尾声

**Rio** [1:38:37]
OK。

**吴涛** [1:38:38]
我们今天才不到两个小时 。

**Rio** [1:38:41]
哇哦 。

**吴涛** [1:38:42]
啊 ， 居然有人写短句 。

**Rio** [1:38:44]
弹冠相庆啊 。

**吴涛** [1:38:46]
哈哈哈哈 。

**Rio** [1:38:47]
弹弹弹 ， 我让你弹 。

**吴涛** [1:38:48]
哦哦 ， 来来来 。

**Rio** [1:38:52]
哈哈哈 。

**吴涛** [1:38:52]
呃 ， 那终于把收尾讲一下 。

**Rio** [1:38:58]
啊 ？ 收尾是什么 ？

**吴涛** [1:39:00]
哈哈哈哈 ， 这个 ， 迷之萌点 。

**Rio** [1:39:06]
每次都是你在收尾嘛 。 就讲一下大家的公 ， 呃 ， 我们的联系方式啊什么的 。

**吴涛** [1:39:12]
好吧好吧 。 那感谢大家收听本次的节目 。 应该说我代表自然自创先感谢大家收听本次节目 。 然后如果大家喜欢我们的节目的话 ， 可以在社交网站上关注我们 。

我们在推特 、 新浪微博以及微信上面的 ID 都是 the type，T-H-E-T-Y-P-E。 那么在 Facebook 上可以搜索 type is beautiful， 找到我们 。 同时呢 ， 大家也可以通过 email 来跟我们取得联络 。

我们的邮箱地址是 podcast@the type.com，P-O-D-C-S-T at T-H-E-T-Y-P-E dot C-O-M。 同时通过这个邮箱地址也可以在支付宝或者 PayPal 上面给我们捐赠 。

捐赠的听众呢 ， 就会有机会进入我们的这个抽奖活动

。

**Rio** [1:40:00]
你看人家还有抽奖 。

**吴涛** [1:40:01]
哈哈哈哈 ， 搞得我都不好意思说了 。 呃 ，anyway， 感谢收听 IPN Podcast， 网络旗下的 IT 技术属于娱乐节目内讧恐慌 。

我们号称 hardcore，但是没有干货 。 想听人听 ，不想听人就别听 。 你可以为本节目捐款 ， 捐款地址是 kernelpanic.fm/donate。 捐款金额随意 ， 只要是 8 的正常数倍就可以 。

捐款 ， 捐款不会为你带来什么 ，不捐也不会让你试什么 。 我说这句话的时候舌头都在打抖 。

**Rio** [1:40:30]
可见你多久没有录这个节目了 。

**吴涛** [1:40:32]
对 ， 我们 ， 我们应该来搞个抽奖 。 具体抽什么还得想一想 。

**Rio** [1:40:38]
你要给人准备礼物啊 。

**吴涛** [1:40:40]
呃 ， 说点事 。 我们口号是 no hard feelings。 如果你有任何反感 。 No hard feelings,right? 如果你有任何 。

**Rio** [1:40:50]
根本就是没真心要准备礼物的感觉 。 你这个接的 。

**吴涛** [1:40:56]
可以发电子邮件到 kernelpanic@ipn.li。 同时也欢迎你收听 Rio 主持的 《 疯投圈 》。Rio， 你还在主持 《 疯投圈 》 吗 ？ 以及 IPN 旗下的 。

**Rio** [1:41:08]
刚放了一期 。

**吴涛** [1:41:09]
Oh, very nice。 以及 IPN 旗下的其他几档节目 ： 未知道 、 太依赖了 、 流行通信 、high story、 阴影像 、 无次元 、 博物制 、 选美 、 皮下官 、 一天世界 、 时尚怪物 。

呃 ， 我们下期节目再会 。

**Rio** [1:41:22]
拜拜 。

**吴涛** [1:41:24]
拜拜 。

**Rio** [1:41:25]
拜拜

。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
