# 58. Kerning Panic·字谈字串（九）名名之中

内核恐慌 · 2020-05-25

<https://lib.pan.icu/834d895c-ae97-487e-9f17-5b1736fbb0ff>

本期《内核恐慌》与《字谈字串》串台，聚焦数字空间中的命名规范：从文件名的技术限制（DOS的8.3规则、Windows保留字如COM1、LPT1）到编程标识符的大小写风格（驼峰、蛇形、烤肉串），再到URL和hashtag的字符编码问题。嘉宾Eric和钱蒸鱼回溯了文件扩展名源于CP/M的历史，对比了Mac资源分支与Windows扩展名的哲学差异；讨论了空格、反斜杠、冒号等特殊字符在跨平台时的转义困境，以及日文Windows中反斜杠被日元符号替代的往事。还分析了大小写敏感性与保留性的权衡——现代系统多采用大小写不敏感但保留大小写的方案，而编程语言标识符则严格区分大小写。Unicode带来的复合字符和emoji命名进一步增加了复杂性，导致系统安全漏洞和兼容性难题。

## Questions this episode answers

### 《内核恐慌》网站为什么要使用丁卯点阵体？效果怎么样？

Rio 在听友节目后受到启发，将网站英文字体换为丁卯点阵体。它虽是矢量模拟的“伪点阵”，但体积仅约 500 KB，比真正点阵兼容性更好。通过设置合适的 CSS 字号可实现像素级锐利显示；他们还为等宽代码和斜体口号定制了字型。不过，若浏览器宽度非整数缩放，边缘仍会出现灰度虚化。

[3:13](https://lib.pan.icu/834d895c-ae97-487e-9f17-5b1736fbb0ff?t=193000)

### 为什么在文件名中使用空格会造成问题？

吴涛和 Rio 指出，命令行中空格被用作命令与参数的分隔符。若文件名含空格，需用引号包裹或转义（如 backslash），否则会被误读为多个参数。此外，连续空格在非等宽字体中很难辨清个数。DOS 原不允许文件名含空格，现代系统虽已放开，但为减少脚本处理时的麻烦，仍建议避免在文件名中使用空格。

[1:01:46](https://lib.pan.icu/834d895c-ae97-487e-9f17-5b1736fbb0ff?t=3706000)

### 编程时为什么变量名不能用空格，而要用驼峰或下划线等方式？

Rio 和吴涛解释，编程语言的标识符（变量、函数名）无法含空格，因空格被用于词法分隔。为此，开发者通过大小写交替（驼峰式 CamelCase）、下划线连接（蛇形式 snake_case）或连字符连接（烤肉串式 kebab-case）来模拟单词边界。其中连字符因可能与减号冲突，通常只见于 CSS 等无需计算的环境。

[1:11:16](https://lib.pan.icu/834d895c-ae97-487e-9f17-5b1736fbb0ff?t=4276000)

### 为什么 Windows 需要文件扩展名而 Mac 却不必须？

Eric 介绍，扩展名概念源自 CP/M，DOS/Windows 借此在文件名末尾标识文件类型。而经典 Mac OS 使用 resource fork 将类型信息存为文件元数据，无需扩展名。后期为兼容网络交换，macOS 也默认隐藏扩展名但仍依赖它。Unix/Linux 则更倾向于通过 magic number 等启发式方法判断文件类型，两种哲学反映了对“文件是什么”的不同理解。

[41:58](https://lib.pan.icu/834d895c-ae97-487e-9f17-5b1736fbb0ff?t=2518000)

## Key moments

- **[0:00] 丁卯点阵**
  - [2:11] 《内核恐慌》官网换上丁卯点阵体，Eric称因听了《字谈字畅》关于丁卯体的那期节目
  - [3:13] Eric计算：10×10像素汉字仅需100比特，但web字体不支持内嵌点阵
  - [4:14] 文泉驿在中文互联网早期利用网页让大众逐像素拆分汉字，产生免费点阵字体
  - [5:34] Eric将丁卯点阵体压缩为WOLF2，文件大小不到500KB
  - [7:15] Eric指出现代显卡即便整数倍缩放也会插值，导致点阵字体边缘模糊
  - [8:04] Eric解释：目前显卡无法实现整数倍缩放，4K屏幕显示1080p游戏时仍需插值
- **[38:25] 文件命名**
  - [41:14] DOS时代的文件命名遵守8.3规则，文件名最多8字符，扩展名最多3字符
  - [41:58] 文件扩展名源自CP/M操作系统，其创始人认为类型应是文件名的一部分
  - [42:54] 文件类型应体现在文件名中还是作为独立元数据存储，这是一个哲学问题
  - [43:12] 经典Mac OS通过资源分支（resource fork）存储文件类型元数据，不依赖扩展名
  - [44:06] polyglot文件可同时是图片和压缩包，利用文件头部魔术字欺骗多类型识别
  - [45:07] DOS 8.3文件名总共只能使用11个字符，包括点和扩展名
- **[1:01:38] 空格之痛**
  - [1:02:04] Eric因早年使用DOS而至今不习惯在文件名中使用空格
  - [1:02:25] 吴涛看到视频中Mac老用户自然地将硬盘命名为带空格的“iMac HD”，感叹这是祖传习惯
  - [1:03:29] 命令行中带空格的文件名需要用引号括起，否则会被当成多个参数
  - [1:05:25] 非等宽字体下，文件名中连续空格的个数难以分辨，易导致混淆
  - [1:06:52] Windows的“Program Files”目录因含空格而成为命令行操作中的著名痛点
  - [1:09:29] DOS因斜杠已被用作命令参数标志，故采用反斜杠作为路径分隔符
- **[1:11:01] 命名风格**
  - [1:11:01] 编程标识符不能含空格，由此产生了驼峰、下划线等分词命名规则
  - [1:12:22] 吴涛解释驼峰命名与帕斯卡命名，Go语言利用首字母大小写控制标识符可见性
  - [1:14:00] 缩略词在驼峰命名中如何大小写始终存在争议，如XMLHttpRequest中XML全大写但HTTP首字母大写
  - [1:16:32] 吴涛认为API命名不一致纯属设计者个人偏好，如XMLHttpRequest便是拍脑袋的结果
  - [1:18:44] 使用下划线命名的标识符在双击选中时会被全部高亮，对开发者更友好
  - [1:20:03] Kebab-case因连字符像串肉扦而得名，形象表现了词间用横线连接的样式
- **[1:25:23] 网络命名**
  - [1:25:33] URL中空格被编码为%20，用户名、标签等标识符也普遍禁止使用空格
  - [1:27:48] 微博因中文不分词，采用双井号作为引号来标记话题范围
  - [1:30:00] Objective-C的API名冗长，如“在索引处按连字符断行前”方法名称长达50字符
- **[1:30:01] API之长**
  - [1:31:13] Eric认为Objective-C和Java重度依赖IDE自动补全，否则长函数名将难以手写
  - [1:31:53] 早期Unix函数名极短如getch，因为在慢速终端上每减少一个按键都意义重大
  - [1:35:21] 吴涛读出50字符长的Objective-C方法名，并指出这还不是最长的，.Net有103字符的API
  - [1:36:27] 吴涛评价Cocoa API虽冗长但可读，而.Net的API又长又难懂，如103字符的某方法
  - [1:37:19] Cocoa用should/did表示动作前后，可能受AppleScript自然语言风格影响
  - [1:39:11] 中国程序员常使用拼音缩写命名，如将“政府网站”简写为JFWJ，导致可读性差
- **[1:43:36] 字符禁忌**
  - [1:47:17] 日文Windows因码位替换，反斜杠显示为¥，导致路径中满是日元符号
  - [1:49:00] Eric揭秘Mac不允许文件名含冒号的原因：经典Mac OS曾用冒号作为路径分隔符
  - [1:49:50] 吴涛发现Mac文件名中的冒号与斜杠在Finder和终端中会互换显示，底存仍为冒号
  - [1:51:30] Windows保留文件名如COM1、LPT1不能用作普通文件名，源自传统设备名
  - [1:52:21] COM是DOS中控制台的设备名，copy COM target.txt可从键盘输入内容
  - [1:57:56] 吴涛解释大小写敏感与大小写保留：前者决定是否视为同一文件，后者仅保留用户输入形式
- **[2:04:37] Unicode陷阱**
  - [2:04:45] 现代编程语言如Swift支持以Unicode甚至emoji作为标识符，引起可读性争议
  - [2:06:04] Rio在播客中用声音模拟emoji，吴涛建议出一套“播客emoji发音指南”
  - [2:07:36] 早期iPhone曾因接收到特殊Unicode序列而崩溃，暴露软件处理复杂编码的漏洞
  - [2:08:51] Unicode体系庞大复杂，增加了软件的攻击面，输入验证不严易导致安全漏洞
- **[2:09:06] 尾声**
  - [2:09:44] Lua语言坚持ASCII-clean原则，核心库不触及第八位，以减少复杂度和安全风险
  - [2:10:39] Unicode核心规范PDF在13版已超过1000页，仅core部分就976页

## Speakers

- **吴涛** (host)
- **Eric** (guest)
- **钱蒸鱼** (guest)

## Topics

字符编码, 绘文字

## Mentioned

Apple (company), CP/M (product), DOS (product), Linux (product), Mac OS (product), Twitter (product), Unix (product), Windows (product), 丁卯点阵体 (product), 微博 (product), 文泉驿 (product)

## Transcript

### 丁卯点阵

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

大家好 ， 今天是 2020 年的 5 月 26 号 ，也是 " 字谈字串 " 的第 126 期 。

**吴涛** [0:29]
呃 ， 您正在收听 《 内核恐慌 ： 一档大剧集算计科系为主题的娱乐 Podcast》， 我们号称硬核 ，但是也没有什么干货 。

想听就听 ，不想听就别听 。 这是我们的第 58 期 ，anyways。

**Eric** [0:42]
是啊 ， 这同时也是我们 《 字谈字唱 》 和 《 内核恐慌 ： 串台 》 的 " 字谈字串 " 的第 9 期 。 嗯 ，《 字谈字唱 》 是全球首家用华语制作的字体排印主题播客节目 ， 我是主播 ， 文川西畔斗云居 Eric。

**钱蒸鱼** [0:57]
我是主播黄浦江边清蒸鱼 ， 钱蒸鱼 。

**吴涛** [1:01]
呃 ， 我是乌涛 。

**Eric** [1:02]
我是 Rio。 哇 ， 我们都串了 9 期了呀 。 对呀 ， 然后我们上一期是 ， 嗯 ， 一年之前录的 。 我们串了 9 期了 ， 我们都还没有那个 title， 就是你们前面那个很酷炫的那个 title。

**吴涛** [1:17]
我们曾经有过 ，但是我们觉得太 awkward 了 ， 所以我们放弃了 。

**Eric** [1:23]
距离上次 《 字谈字串 》 第 8 期哈 ， 那期是叫什么 ，《 人造千年虫 》。 哇 ， 那时还是令和元年， 对吧 ？2019 年的 5 月 14 号 ， 刚好是整整一年 。

哎 。 在这一年里面 ， 我们的 《 字谈字唱 》 从第 99 期更新到第 126 期 ，《 内核同宽 》 呢 ， 从第 55 期更新到了第 58 期 ，是吧 ？

**吴涛** [1:47]
沧海桑田 ， 中间经历了多少巨变啊 。

**Eric** [1:50]
人家都两位数变三位数了 ， 我们还缓慢地爬行着 。 我们总共更新了 3 期 。

**吴涛** [1:58]
但是你们很厉害啊 ， 你们图标也变了 ， 那个域名也变了 ， 然后连官网的字体都换掉了 。

**Eric** [2:04]
哎 ， 对 ， 我们这个是应该是 2020 年改头换面了哈 ， 之前 ——

**吴涛** [2:09]
我们功夫都用在节目之外了 ， 应该说 。

**Eric** [2:11]
这叫 " 看得见的地方叫听不见的地方 "。

哇 ， 说实话 ， 我现在现在打了个怕你哭 ， 还是感觉很有违和感 ， 你知道吗 。

**吴涛** [2:21]
为什么 ？

**Eric** [2:22]
不听好的吗 ？ 怕你哭多好呀 。 好怪 。 听起来很 、 很日本嘛 。

**吴涛** [2:28]
然后， 呃 ， 这个点阵字看起来还感觉挺好的 ，不过 。

**Eric** [2:32]
啊 ， 对 ， 点阵字呢 ， 就是因为上次听了你们 ， 应该是最新一期节目吧 ， 就是 《 丁卯体 》 还是前一期 。

**吴涛** [2:39]
嗯 ，因为我们是前一期了 ， 已经是 。

**Eric** [2:41]
对 ， 前一期了 。 你们那个速度比较快 。 然后我就说 ， 嗯 ， 我之前本来一直想换的嘛 ， 然后就是因为之前 ， 呃 ， 我们是先换的这个 logo， 先换的那个像素点 ，也不叫像素点吧 ， 那个叫什么 ， 我叫 LED 灯的那个风格的 logo 嘛 。

**吴涛** [2:58]
圆的是吧 。

**Eric** [2:59]
对对对 。 当时我就想说 ， 哎 ， 那干脆拿这个风格把这个正文字也换了 ，不是有这个 web font 嘛 。 但是后来转念一想 ， 那中文字体的 web font 马上就劝退了嘛 ，因为都知道这个体积会比较 、 比较惊人， 对吧 。

然后后来听你们前一期节目找这个 Willy 来聊的时候 ， 我在想 ， 哎 ， 如果是纯点阵的 ， 那不就没有这个体积问题了吗 ？

因为我简单算了一下这个数 ， 对吧 ， 假设我是一个 ， 呃 ，10 像素乘以 10 像素的汉字 ， 那么一个像 ， 就算我不压缩的情况下哈 ， 我一个汉 ， 一个方块就是 100 个 bit 嘛 ，100 个 bit 除以 8 才多少 ，不到 ，不到 20 个这个 byte， 对吧 。

算下来 ， 还 、 还要再 、 再稍微压缩一下， 应该是可以接受的嘛 。

**吴涛** [3:43]
但是问题是丁卯它不是真正的点阵啊 ， 它其实还是矢量字啊 ， 问题是 。

**Eric** [3:48]
这就是我遇到的第一个问题 ， 就是后来发现是没有办法使真的使用在这个 ， 就是 web font 真的是没有办法使用点阵字体的 。

就好像跟 Willy 那期你们也聊了嘛 ， 就是那个 Windows 的那个自带的那个系统字体 ， 它有好几个都是有那个内嵌点阵的嘛 。

**吴涛** [4:03]
嗯 ， 对 ， 那个所谓的忠义宋体嘛 。

**Eric** [4:06]
对对对对对 。 还包括之前就是在古早时期的这个 Linux 系统里面 ，有那个叫文泉驿那个那套东西 ， 你们知道吧 。

**吴涛** [4:14]
那应该是 PCF 吗 ？

**Eric** [4:15]
啊 ， 这个格式我不知道 。 我就说就是文泉驿他们当时也做过 ， 就是那种 ，他做过那个 ， 就是叫 、 叫 ，他叫 、 他叫开源吗 ？

我不知道 ， 就是免费的这种 ， 就自由的这种中文点阵字 ，他做了一个高质量的嘛 。 当时是 ， 应该是中文互联网上比较早的那种 ， 就是 crowdsourcing 的项目哈 。

因为他当时我记得是做了一个这个 ， 呃 ， 网页 ， 那个时候还挺不容易的 ， 那个时候网页技术都比较落后嘛 。他们用通过这个网页的方式让大家去拆这个字 ， 然后点这个像素点嘛 。

然后就是他们也 ， 那边也有一套这个点阵字 ，但是呢 ， 这些都是没有办法用到这个那个 web font 里面的 。

因为 web font 那个目前主流的几个格式哈 ， 最最开始的那个 EOT 什么 ， 叫做 embedded open type， 对吧 。 后来的这个 SVG， 包括在目前最新的那个 WOLF 和那个 WOLF2， 对吧 。他们在那个生成的时候就直接是不支持这个内嵌点阵的 ， 所以这条路就是断掉的 。

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

**Eric** [5:10]
那所以你上期这个 Willy 他做那个也是一个 ， 就是折 、 折中的方案嘛 ， 就是用矢量来啊 ， 模拟点阵的那种风格 ， 对吧 。

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

**Eric** [5:21]
但是你看 ， 比如说这个其实还是有用的 ， 就是虽然说不是一个真正的点阵 ， 就是我要 ， 我要表达一个 ， 呃 ，10 个像素乘以 10 个像素的字符 ，并不能真的只用 100 个 ， 呃 ，bit 就可以实现哈 。

但是因为 ， 呃 ， 极度简化过的那个方 ， 那个就是微点阵嘛 ， 就是矢量 ， 矢量点阵 ， 它其实是一个各种各样的小方块嘛 ， 对吧 。

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

**Eric** [5:45]
小方块的就有个好处 ， 它就是什么没有这个什么什么曲 ， 贝塞尔曲线那些转角啊什么的 ， 它的那个点就比较少嘛 。

**吴涛** [5:52]
嗯 ， 呃 ， 没错 。

**Eric** [5:53]
你 、 你 、 你想想这个道理吧 。OK， 就是确实就拿这个 Willy 他拿这个 ，他 、 他给了我一个这个丁卯的 TTF， 然后我把它转成那个 ， 那个 WOLF2。WOLF2 是 WOLF 的那个升级版 ， 它的压缩比例又提高了百分之 ， 好像 20 左右吧 ， 应该是 。

那其实我 、 我压完之后， 它当时给的是一套这个 ， 就是还在 beta 中的这个丁卯体的这个文件给我嘛 。

我压完之后其实也就才不到 500KB 的那个大小 。

**吴涛** [6:20]
啊 ， 那挺好的呀 。

**Eric** [6:21]
对对对 ， 就 500KB 可能在 ， 比如说在五年前 ， 可能还是一个有一点纠结的这个尺寸 ，因为毕竟还是网络要下载 ， 然后带宽不高的情况下嘛 。

但现在 500KP， 我们这个有 4G 网络 ， 马上 5G 网络 ， 对吧 ， 又是这个光纤 ， 入户都还挺多的 。500KB 的话 ， 你其实你在这个 Instagram 上刷 、 刷一张图 ， 估计都 、 都不止 500KB 了 ， 对吧 。

很多这个网页你加载一个这个什么 JavaScript 的这个库 ， 那可能都是差不多那个水平了 ， 所以完全可以接受嘛 。

所以我就想 ， 哎 ， 那其实是可以的 。 我就换上这个 ， 这个把我们的这个官网的那个 ， 呃 ，web font 就换上了这个丁卯作为主 ， 然后这样设了一些这个系统自带的一些 backup 嘛 。

就是如果因为某种原因你的这个系统 ， 你的那个浏览器不够现代 ， 或者是你用的那个 ， 那个什么插件禁用那个 web font 的话 ， 那你还是会退到你系统默认的那些字体嘛 。

所以就整个起来就风格就还觉得还不错啊 ， 哈哈 。

**吴涛** [7:19]
嗯 。 用这种假的点阵的话 ，其实 ， 嗯 ，其实是矢量嘛 。

**Eric** [7:25]
嗯 。

**吴涛** [7:26]
但是你这样用 ， 容 、 容易用 ， 要不然的话你点阵 ， 真点阵的话你那个字号不好弄嘛 。

**Eric** [7:32]
对 ， 就是有这个问题 。

**吴涛** [7:34]
真点阵的话你一个字号要一套点阵 ， 反而这种假点阵的话你可以 ， 就是你可以随意缩放嘛 ， 反 、 反而更好 。

**Eric** [7:42]
是是是 ，因为你如果用真点阵的话 ， 缩放的话 ，因为其实现在 ， 呃 ， 我想想 ， 呃 ， 我们至少在英特尔出那个 ， 还有 AMD 吧 ， 出下一代的那个显卡之前 ， 我们目前所用的这个 ， 就是就是显卡呀 ， 这个包括不管内嵌的呀 ， 还是独立的 ， 包括手机上的也好 ， 它都不能做我们叫做这个整数倍缩放 。

什么意思呢 ？ 就是比如说我要 ， 呃 ， 我们现在都是从用的这个什么所谓高分 ， 这个高清屏嘛 ， 什么 2X、3X 的 ， 什么意思 ？

就是相对于 ， 相对于一个像素点 ， 它我们之前讨论过啊 ，是用 ， 可能是用 4 个物理点 ， 或者是 9 个物理点 ， 就是 2、2×2 或者 3×3 的这个这个格子来做嘛 。

所谓的这个整数倍缩放什么意思呢 ？ 就是说假设我是一个这个 4K 的屏幕 ， 对不对 ， 然后但是你想那个 4K 游戏 ， 它有很多这个特效 ，不是显卡的处理能跟不上嘛 。

所以整多很多时候它只能用这个 ， 呃 ， 就放这个 1080 来的这个分辨率来 、 来 、 来 ， 呃 ， 显示这个游戏 ， 对吧 。

但是 1080 分辨率 ，但是你又是 4K，4K 就刚好是 4 个 1080 的屏幕的那个拼 ， 就是填字格拼起来嘛 ， 对吧 。

那这就有个问题了 ， 那 ， 呃 ， 一个 1080 像素点是对应 4 个这个 4K 的像素点嘛 。 就我们通常想 ， 那肯定就是说把那 4 个物理像素点都 、 都渲染成这个一个这个逻辑像素点的那个颜色 ， 那这样不就看起来 ， 虽然说是 4 个 4K 的屏幕 ，但看起来还是 1080、1080 的那个清晰 ， 那么锐利 ， 对不对 。

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

**Eric** [9:07]
但其实并不是这样子的 ，因为现在主 、 主的显卡都是叫做它叫什么 linear 的这种 。

**吴涛** [9:13]
Inter， 哎 ， 那个词叫什么来着 ？

**Eric** [9:14]
Interpolate。

**吴涛** [9:15]
对 ，interpolate， 就是它就会去插值 。

**Eric** [9:18]
插值 。

**吴涛** [9:18]
插值去算嘛 ， 比如说我要 ， 如果你想象一下这么一个场景 ， 你说你这个 1080 的屏幕上从左到右是一个从 ， 呃 ， 白到黑的一个渐进的一个过渡 ， 对吧 。

正常的话 ， 如果说你是这个在 4K 屏幕上显示 ， 那你说你每一个线条绘制两边嘛 ， 就是每 、 每一竖哈 ， 每一竖行你就绘制两边 ， 对不对 。

但其实并不是这样 ， 它还是要在 4K 上， 它是要算出那两条 1080 的中间值是怎么样子 ， 然后再把那个中间值绘制在那个 4K 的那个多出来的那个像素 ， 那 、 那 、 那一竖的这个像素上面去吧 。

那在这个网页的上面其实有类似的问题啊 ， 就是说我本来说我有一个这个 ， 比如说是这个 10×10 像素的这个点阵字 ，但我 、 我能不能渲染到这个 20×20 这个分辨率上去 ，其实是做不到的 ， 对不对 。OK，在这个情况下， 就刚才 Eric 说那个问题啊 ， 就说你反而用这种微 ， 呃 ， 微点阵 ， 就是这 、 就是用矢量来模拟的 ， 反而更好 ， 它可以缩放一点 。

但是我遇到一个问题 ， 就是现在这网页的 CSS 里面那个宽度啊 ， 它有 、 有可能我不是按这个整数像素来定的那个宽度 ， 它可能比如说是一个百分比 ，是吧 。

百分比之后它算出来就它最后还是要落 、 落实的它的这个叫什么 ， 就是 Rasterize 的时候啊 ，Rasterize， 我们叫三格化的时候的时候 ， 它还是会 、 会变成要 、 要变成一个具体的到哪一个像素点的坐标嘛 ， 上去嘛 。

就是有时候如果你是按百分比的话 ， 它就它不就除不尽嘛 ， 它就有这个小数 。 那么就变成了就说 ， 呃 ， 这个就结合到我们之前几期谈过的那个四像素平滑的问题 ， 对吧 。

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

**吴涛** [10:47]
以前是就说灰度平滑嘛 ， 就是说 ， 呃 ， 我先还是一个像素 ， 我不 、 不考虑这个 LCD 屏幕这个这个子像素的结构 ， 我直接按灰度平滑 。

比如说我们现在在这个 iOS 设备上面都是这样子的 ， 对吧 ， 它是没有这个四像素平滑 ， 都是灰度平滑的话 ， 这样的话就相对来说还好一点 。

它就最多是在左边一个像素或右边一个像素 ， 或者它如果它觉得这个应该是两个像素之间 ， 那它可能在这个灰度上面做一些这个这个平均 ， 对不对 。

但是就会导致我这个丁卯点阵体哈 ， 本来我想的效果是应该是非常边缘锐利 ， 我把它那个那个叫做那个像素的那个字体的尺寸调好的话 ， 它边缘应该是非常锐利的嘛 。

但是因为由于这个非整数的这个这个宽度的问题 ， 它可能那个字的那 、 那一竖哈 ， 比如说它起始的那个位置 ， 它在排版引擎加上这个三格化之后算出来 ， 哎 ， 它是在这个从左到右第 32.57 个像素点 ， 那个可是那个时候再开始绘制 ， 这个时候怎么办呢 ？

就是你还是会看到 ， 就是在有些地方它的那个这个字的边缘是有一层这个那个叫什么 ， 就是灰灰灰灰的那种感觉的 。

如果说你是有这个四像素平滑 ， 然后你这个人眼睛又比较敏感 ， 或者是这个你的屏幕素质是有一点问题的话 ， 你看到它可能边上有一点那种就叫那个彩边 ， 对 ， 彩边那个 clear type 那种常见的问题嘛 ， 所以还是挺头疼的这个事情 。

**Eric** [12:08]
对 。

**吴涛** [12:09]
哎 ， 毕竟你是假 、 假点阵嘛 。

**Eric** [12:11]
对对对 ， 就假点阵这个问题 。 但是就是说 ， 呃 ， 刚才你说的那个缩放的问题 ，其实这里还是有一点技巧的 ， 就并不是说 ， 呃 ， 我因为是这个微 、 呃 ， 真矢量微点阵就可以自由缩放了 。其实也我要达到刚才那种就是叫做 pixel to pixel 啊 ， 就是 ， 呃 ， 像素点对像素点的那种清晰和锐利的话 ，其实还是有讲究的 。

比如说这个我用的那个阵文体是丁卯的 ， 丁卯其实只有两个尺寸 ， 就是 7 像素和 9 像素嘛 ， 对吧 。7 像素假设它其实是因为有一个像素的留白的话 ， 它其实是 8 像素宽和 10 像素宽的这么一个 ， 啊 ， 字体 ， 对吧 。

这样你在 CSS 里面设置的时候呢 ， 你就要设置成 ， 呃 ， 正常你应该设置成 10 个像素 ， 对不对 。

但是因为 10 个像素实在是太小了 ， 就是那个 ， 就是因为现在很多屏幕的这个分辨率挺 、 挺高的嘛 ， 就是而且手机上你强制设置 10 个像素 ， 它也字也比较小 ， 所以我就设置成了 15。

哎 ，15 你想不就除不尽了吗 ， 对不对 。

**吴涛** [13:04]
你 、 你必须把它量子化 。

**Eric** [13:06]
它其实是可以的 。 因为我看目前我们大部分人用的这个不管是笔记本也好啊 ， 还是这个 ， 就至少 Mac 哈 ，Mac 现在应该已经没有这个非 Retina 屏幕的 Mac 在销售了 ， 对吧 。

**吴涛** [13:17]
销售肯定没有了 ，但使用肯定还是有的 。 而且你要考虑到外接显示器这个问题啊 。

**Eric** [13:21]
就是至少 、 至少是所有的 Mac， 就是新机和这个所有的这个 ， 呃 ， 就是目前应该在世的这个 iOS 设备应该都是这个所谓的这个高分屏嘛 ， 就 、 就是就 Retina 屏幕 ， 对不对 。

那么就有两种了 ， 我们一种是就是常见的 Mac 都是这个 2X 的 ， 对吧 ， 然后还有这个那个叫什么 iPhone， 这个什么 ， 比如 11 Pro， 它是那个三 、 三 、 三倍的那个三叉的 ， 对对 。

那三叉的话就相对来说我就那个就相对来说我也没有那个设备嘛 ， 所以我都是两叉的设备 。 我就设置成 15 个像素 ，15 个像素的逻辑其实对应 30 个像素的物理 ， 对不对 。OK，30 个像素的物理除以 10 个像素的这个丁卯的点阵体 ，不是刚好也能是三倍嘛 。

**吴涛** [14:02]
所以它是最小的最小公倍数是吧 。

**Eric** [14:05]
对对对对对 ， 搞个这个这个它能够能够整除的地方就还挺好的 。 但是问题就来了哈 ， 我后来我想起来了 ， 你记不记得那个你们有买最新的那个 MacBook Pro 的笔记本吗 ？

就最近两三年的 。

**吴涛** [14:19]
怎么了 ？

**Eric** [14:19]
特别是 13 寸的那个那个机型 。

**吴涛** [14:21]
没有 。 想买没有 ， 没 、 没有人给我们捐款 。

**Eric** [14:25]
就是那个 ， 哈哈哈 ， 对 ， 这个我们忘了在节目里面说了 ， 请大家给我们捐款 ， 想请请见我们 。

**吴涛** [14:33]
没有人用爱给我们发电 。

**Eric** [14:34]
点 IC， 哈哈哈 。 呃 ， 说回来 ， 说回来 ， 就是就是 13 寸那个机型的那个屏幕的那个那个那个面板的分辨率是我记得是 2560×1600， 应该是这样 。

就是它的逻辑是 1280×800 嘛 ，1280×800 在当下其实是一个非常窄的一个显示的面积 ， 对不对 。 所以呢 ， 苹果后来应该我记得应该是在前几年开始吧 ， 就应该就是最近这一代 ， 就是那个就是把就是蝴蝶键盘那 、 那代开始 ， 它的那个出厂默认设置 13 寸的那个 MacBook 的的那个默认的分辨率 ， 它并不是点对点的那个清晰的 。

它用了一个就它的默认值是一个缩放的 ， 就是它缩放出来应该是个 1440×900 的这么一个 ， 呃 ， 逻辑的分辨率 。

但其实它的物理上它并除不尽嘛 ， 你就啊 ， 就 2560 除以这个 1440 是除不尽的嘛 ，因为 2560 刚好是 1280 的两倍嘛 。

所以它虽然说是逻辑上的这个 2X，但它物理上并不 ， 物理上并不是 。

**吴涛** [15:40]
它只是没有点到点 ， 就它推荐的那个设置没有点到点 。

**Eric** [15:45]
对对对 。

**吴涛** [15:46]
它现在我已经完全不点对点了呀 ， 所有的 。 但我都是调到点到点的 ， 比如我现在这台 15 寸的 ， 我不用它默认的那个缩放 ， 我就会改成正好是两倍的那个分辨率 。

**Eric** [15:58]
对 ，因为 15 寸它原生的这个点对点分辨率应该是 1440 宽的嘛 ， 对吧 ， 它其实调成 。

**吴涛** [16:03]
但它推荐你设的是 1680×1050 的 。

**Eric** [16:06]
对对对 ， 它都 、 都 、 都是变成我们叫做 scaled mode 嘛 ， 就是缩放模式 ， 对不对 。

**吴涛** [16:10]
对 ， 它可以让你的屏幕看起来容量更大一点 。

**Eric** [16:13]
对对对 ，因为它就是要展示更多的内容嘛 ，但是其实这样是会影响 。

**吴涛** [16:17]
它可以让你的视力下降得更快一点 。

**Eric** [16:20]
其实应该绝大部分人是看不出来的 ，但是如果说你对这个点对点这种有洁癖的话 ， 比如说我们如果要强行用这个丁卯点阵 ， 要点对点的话 ， 你在这两个就是你在最新的这个 MacBook 笔记本上是实现不了的 。

**吴涛** [16:33]
嗯哼 。

**Eric** [16:34]
对吧 ，因为它默认值不是那样子的嘛 ， 所以我都是把那个默认值调 ， 呃 ， 我都是手动 ， 呃 ， 把它改成这个 2X 的那个点对点的模式 ， 这样我看起来那些才 、 才正常嘛 。

但这样的后果就是说你的可显示的这个实际面积感觉就变小了嘛 。

**吴涛** [16:50]
就字更大嘛 。

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

**吴涛** [16:53]
嗯 ， 它那个设置不是就是选 ， 你要么选较大文字 ， 要么选更多空间嘛 ， 字很小的空间更大嘛 。

**Eric** [17:01]
是的 。

**吴涛** [17:02]
那它的那个系统设置就让就只能这样选嘛 。

**Eric** [17:06]
对 ， 那这样就会很影响 ， 就本来之前吧 ， 你说你只是你做设计的人有这个问题 ， 你把那个这个调一下， 你这样看出你交付的作品还是这个点对点清晰的 ， 对不对 。

但现在这个默认值变成这个 scaled mode， 就是说你哪怕你交付的作品是点对点清晰的 ， 最后你就是用户渲看到的时候 ， 它其实也是被这个 scaled 掉了嘛 。

所以这个事情我觉得挺 、 挺 、 挺扯的 。

**吴涛** [17:28]
所以它 、 它的意思就是你别纠结这个事情 。

**Eric** [17:30]
已经突破了视觉极限了是吧 。

**吴涛** [17:32]
iOS 设备的话没有办法了呀 。

**Eric** [17:34]
iOS 至少目前还是清晰的呀 。

**吴涛** [17:36]
我觉得它的意思其实是普通用户根本不应该操心这些事情 。

**Eric** [17:39]
嗯哼 ， 对啊 。 但是就是这还是一个 compromise 嘛 ， 就是说在这个 ， 呃 ， 显卡的这个处理能力 ， 面板的这个这个叫什么 ， 就是这个显 、 显示就是显卡到面板的连接带宽 ，以及这个面板的实际的这个工艺的限制的情况下， 做出了这么一个 compromise。

但我觉得这毕竟不是这个长远之计啊 。

**吴涛** [18:02]
哎 ， 我又想起来 ， 我 、 我因为我实际主力机是 27 寸的那个 iMac 嘛 ， 嗯哼 ，是 5K 的屏嘛 。 哇 ， 那个显卡是想就可以看得出来它很 、 很吃力 ， 你知道吗 。

**Eric** [18:14]
哈哈哈 ， 我可以感觉到显卡很吃力 ， 这个共情能力真的 。

**吴涛** [18:19]
5K 的屏幕你渲染的时候得多大呀 。

**Eric** [18:22]
你想想那个 5K 的屏你抓个屏 。

**吴涛** [18:25]
啊 ， 对 。

**Eric** [18:26]
抓个屏出来一个一个 PNG 文件的话 ， 那个也是超大的就是 。

**吴涛** [18:31]
对 ， 还那个还是就是减无损压缩的嘛 ， 都肯定有好几兆了 。

**Eric** [18:34]
对啊 。

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

**Eric** [18:35]
Anyway， 就说回那个丁卯 、 丁卯点阵哈 ， 就所以就当时我们就 ， 呃 ， 我就试了一下， 我就感觉效果还行 ， 然后我就跟这个 Willy 说这个事 ， 然后他还帮我们做了很多其他的事情 。

因为丁卯它应该是我 ， 呃 ， 如果我没记错应该是我们是 ， 就应该是我们网站应该是第一个 ， 呃 ， 正式商用的 。

**吴涛** [18:55]
贵网站是第一个正式商用的 。

**Eric** [18:57]
对对对 ， 然后它就就其实遇到了很多问题 ， 比如说你像我们上一次节目的时候不是有这个讨论这个令和这个这个和字嘛 ， 对不对 。

**吴涛** [19:07]
嗯 ， 它做了吧 ， 我记得 。

**Eric** [19:09]
对 ， 这个令和是丁卯里面它唯一做了两个令和连 ， 就是合在一起的 。 但这个时候其实已经很为很为难了 ， 对不对 ， 一个十像素乘以十像素点阵 ， 你还要加几层两个汉字进去 。

我看了一下反正也是比较勉强 ，但是我还鼓动这个 Willy 说 ， 哎 ， 那你要不要去把这个 。

**吴涛** [19:28]
挑战一下极限好了 。

**Eric** [19:29]
把前面那几个都做完 ， 那个叫什么朝禾 ， 对吧 ， 从朝禾开始一直到朝 ，他说不做了 ，不做了 。 我说 。

**吴涛** [19:36]
九像素做朝禾 ， 我天呐 。

**Eric** [19:39]
不 ， 这还不最难的 ， 还有那个就是那个日文那个朱氏绘社 。

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

**Eric** [19:44]
我觉得做大正可能还可以想象 ， 做其他的 ，oh my god。

**吴涛** [19:48]
那朱氏绘社怎么办 。

**Eric** [19:50]
你不要说这这写了 ， 那当然是不要说和字啊 ， 就写一个汉字 ， 那个什么雷霆万钧啊 ， 那个那个那个都都已经写的了 。

**吴涛** [19:58]
一坨一坨的了 。

**Eric** [19:59]
哎 ， 对对 ， 就这个我就我就担心怕那个 ， 呃 ，不易读嘛 ， 然后我就套上之后我就做了一个这个 usability test， 就是找找这主要是找找我太太拿来试了一下， 我就把我们有一期节目的那个那个就 summary， 就是那个叫什么节目简介 ， 它有一段话嘛 ， 写了一段话 ， 就是 57 期节目有一段话 ， 我先把那个点阵换上， 然后那些就是点对点都调好 ， 然后我让她来

读那段话 。 基本上就还挺挺超乎我意外的 ， 就是还基本上没有出什么差错 。

**吴涛** [20:27]
嗯 ， 就是依人性还是很好的 。

**Eric** [20:29]
嗯 ， 对对对 。

**吴涛** [20:30]
而且呢 ， 主要是你放在这个有上下文之类的话 。

**Eric** [20:33]
没错 ， 没错 。

**吴涛** [20:34]
就可以猜嘛 ， 对吧 ，有语境的话就可以猜 。

**Eric** [20:37]
而且我用的是那个九九像素那款 ， 九像素那款相对来说还是看得清楚一些的 。 七像素那款呢 ， 如果没有上下文确实有点难度了 。

**吴涛** [20:44]
嗯 ， 就关键是有语境的话就好 。

**Eric** [20:47]
是的是的 ， 所以我就想 ， 哎 ， 反正我们这个网站看的人也不多 ， 对吧 ，因为大部分都是在这个就是订订阅订阅在这个这个叫什么播播客客户端里面去去去看的 ，也不会说经常去我们网页翻来翻去 ， 对吧 。

所以我想 ， 哎 ， 那不刚好我们这个网页还可以做的这个风格这个别致一点 ， 反正也不怎么常读它嘛 ， 对吧 ，也没几个字其实 。

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

**Eric** [21:09]
又不像我 ， 你们还要发这个你们官网这个 The Type 官网还要发很多这个博文什么的 ， 我们一般就一期节目可能不到 100 个字的这个汉字 ， 对吧 ， 完全没有问题啊 。

**吴涛** [21:19]
那每期节目来来看的人也就 100 个吧 。

**Eric** [21:22]
呃 ， 我我很怀疑 ， 哈哈哈 ， 我很怀疑 。 那 anyway， 就是就这样的话 ， 我就把那个丁卯用起来吧 ， 然后但是其实我们还遇到了其他很大其他很多问题哈 ， 比如说 ， 嗯 ， 我们上次不是也是讨论这个那期节目 ， 除了讨论有有一些讨论日本的地方 ， 就很多那个叫 show notes 里面有很多这个日文的这个符号嘛 。

**吴涛** [21:44]
啊哈 。

**Eric** [21:44]
然后刚好这个丁卯里面那 Willy 他也做了那个日文的那些什么 ， 就是 。

**吴涛** [21:49]
对 ，他有做的 。

**Eric** [21:50]
对对 ， 就看我觉得效果还挺好的 ， 超乎我的意料 。 后来他他交付给我的就是为了提还是为了这个体积的原因嘛 ， 我就说我们大概率应该不会讲 ，不会也不会打 ， 主要是哈 ，也不会用这个什么阿拉伯文和希伯来文吧 ， 就把那几个符号给去掉了 。

然后我问 Willy 说他应该是没有韩文的部分的 ，因为韩文好像挺坑的 ， 就是比较难做啊 ，但我们想了想 ， 好像我们官网也没有韩文 ， 那这个也还也也就过去了 。

但是又遇到另外一个问题 ， 就是我们毕竟是一个 ， 对吧 ， 面向这个中老年程序员的一个节目嘛 ， 所以比如有一有一有一 ， 呃 ，有两期节目是有贴代码的 ，有一有一小段代码 ， 那么我就需要一个等宽的这个这个拉丁字字符嘛 ， 然后 Willy 就帮我们调了一个这个最开始是用了一个 。

六七像素嘛 ，但就是有些这个还是有些问题 ， 然后后来他又专门帮我们定制了一个这个啊 ， 等宽的这个点阵字 ，但是就不是这个那个严格跟中文有那个等比的关系了 ，但是其实还好 ，因为我不需要跟中文配配对用嘛 。

然后另外一个场景就是我们不是之前呃 ， 每期节目无他都会有一句 slogan 嘛 ， 反正就 slogan 在我们 。

**吴涛** [23:02]
本期的口号是 。

**Eric** [23:03]
对对对对对 ， 我们那个那个 slogan 在排版上 ，在网页上排版 ， 那句 slogan 是斜体排的 。

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

**Eric** [23:10]
哈哈哈 ， 所以为了又给我们定制了一套斜体字的这个丁卯点阵的 ， 就是这个英文英文字符哈 。

啊 ， 当时因为有一个事情过于疯狂 ， 我们就是只是在微信上简单聊了一下， 这个事情并没有真的发生 。Willy 说他其实中文也有斜体的 。

**吴涛** [23:26]
哈哈哈哈

哈 。

**Eric** [23:30]
就所以这个鞋底是 Willy 做的是吧 ？

**吴涛** [23:32]
是 Willy 做的 。其实还可以嘛 。

**Eric** [23:34]
嗯 ， 这也是调了几次的 。

**吴涛** [23:37]
啊 ， 就是是拉丁字母的鞋底 。

**Eric** [23:39]
我想知道它是自动生成的 ， 就是这是一个程序生成的 ， 还是它一个一个自己去排的 ？

**吴涛** [23:44]
一个一个点 。

**Eric** [23:45]
它是自己做的 。

**吴涛** [23:46]
最开始是那个程序生成 ，其实就就不是那个 ，不是鞋底 ，是那个叫做叫做那个那个 oblique 是不是 ？

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

**吴涛** [23:53]
不是 ，italic 是真鞋底嘛 ， 我有个伪鞋底 ， 就直接把那个点阵这个拉斜了 。

**Eric** [23:58]
啊 ， 对 ， 最最开始是那个 ， 就当时我都没有没有留意到这个问题 ，因为我都忘了我们有有用鞋底的地方了 ，因为最近已经没有用了 。

**吴涛** [24:07]
哈哈哈 ， 得亏吴涛说了那么多口号都被你忘了 。

**Eric** [24:10]
中文用鞋底是异端啊 ， 中文用鞋底的地方应该用凯尔提嘛 。

**吴涛** [24:13]
不是不是 ， 就是我们口号都是英文的嘛 。

**Eric** [24:16]
啊 ， 对啊 。

**吴涛** [24:16]
对 ， 所以就是只是英文那部分 ，但是我我开始没有意识到 ， 后来是我把那个那个丁卯 web 就是部署成 web 放到放到网上去 ， 然后让 Willy 来看这个效果的时候 ，他发现了 ， 然后他说 ， 哎 ， 这个鞋底好像是有点问题 ，他就修了一下， 然后给了我单独的一个 ， 就之前给了我单独的一个这个叫做叫做叫 dinky 嘛 ，dinky code， 就是那个等宽的 。

后来又做了这个 dinky 的这个 italics， 就但这这两个都是只包含这个拉丁和这个这个就是常用符号那部分了 ， 就其他都中文肯定没有办法做做鞋底啊 ， 这个这么小的这个情况下 。

但其实你看那个鞋底的话 ， 它的那个易读性就要比那个就是正普通的那个正常版本就要差好多了吧 。

**Eric** [24:59]
那肯定的 。

**吴涛** [25:00]
嗯 ， 就抖啊 。

**Eric** [25:01]
就就真鞋底的可读性是要差的 ，但是伪鞋底那个之前的易读性还是还是挺不错的 。

**吴涛** [25:07]
哈哈哈 ， 很奇怪对不对 ？

**Eric** [25:10]
不 ， 呃 ， 就是这个网页啊 ， 看习惯了以后反而就已经习惯了这个点阵 ， 看习惯了反而呢 ， 就看比如说咱们那个字谈字串的第三期那个表情符号超清晰的 。

**吴涛** [25:24]
哈哈哈 ， 就是那种反差感特别强烈是不是 ？

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

**吴涛** [25:31]
哈哈哈 ， 这个太魔幻了 。

**Eric** [25:33]
对 ， 就是反正我目前就还挺满意这个显示效果的 ， 虽然说就刚才有说如果你仔细看的话 ，有一些这个啊 ， 那但根据你浏览器宽度啊 ，因为它那个那个分栏是自适应的嘛 ，在某些宽度下面它就会出现那个那个叫做灰标的问题 ，但是有些情况下就如果你刚好恰好的分栏出来都是整数倍的这个像素 ， 就不不出现这个就是这个定位 ， 就半个

像素的或者是就小于一个像素的情况下， 它的那个每个边缘都是非常锐利清晰的啊 ，但还要加这个加这个星号 ， 就是啊 ， 你前提是你在一个真的可以点对点显示的这个二这个二叉或者三叉屏幕上才可以 ， 对吧 ，因为你刚才讲了这个 Mac Mac 的那个 。

**吴涛** [26:11]
其实你你特别在意 ， 如果你特别在意这个 。

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

**吴涛** [26:15]
就是显示器 ， 或者说是这个应该其实这个应该是浏览器带来的这个次像素渲染 ， 或者是其他的一些这个抗拒尺寸的效果 ， 你可以在 CSS 里把它关掉 。

**Eric** [26:26]
关掉没有用啊 ， 关掉不解决刚才那个问题啊 。

**吴涛** [26:30]
啊 ， 可以一定程度上缓解 ，因为 CSS 里面至少很多浏览器都支持就是这个 anti-alias 的这个设置 。

**Eric** [26:38]
我知道 ， 我试过那个那个效果比较糟糕 。

**吴涛** [26:41]
这个还是跟底层操作性有关 ， 就是你在 Mac 和 Windows 上不能使用同样的 CSS 规则来达到同样的效果 ， 这是最大的问题 。

**Eric** [26:48]
可以可以把那个几个浏览器兼容的 CSS 全写上 。

**吴涛** [26:52]
它只要不冲突的话都可以都写上 。

**Eric** [26:54]
就啰嗦一点 。

**吴涛** [26:55]
不是 ， 就是你你同你用同样的规则在 Mac 和 Windows 上得到的效果是不一样的 ， 这是最大的问题 。

**Eric** [27:01]
对对对 ， 就是关掉次像素平滑这个事情呢 ， 各家的实相上都是都是问题比较多的 。

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

**Eric** [27:07]
所以因为这个事情也不是一个就常见的 。

**吴涛** [27:09]
CSS 规则里面有一条就是好像叫呃 text rendering 还是叫 font rendering， 它有 ， 然后它现在有两个 ， 呃 ， 应该是 Mozilla 和 WebKit 各有一个实现 ，但这两个实现最后得到的效果都是就在 Mac 上要好很多 ，但是在 Windows 上就还是死一坨 。

**Eric** [27:25]
对对 ， 反正就这个问题是比较多的 。 所以所以就刚才那个珍羽说这条 ， 我我其实我在开发的时候我已经试过了 ， 那个效果是比反正一个是不一致哈 ， 一个就是说其实挺糟糕的 ，而且也不能解决刚才说的 ， 比如说你的那个屏幕不是那个点对点导致的这个问题 ， 这个是你不管软件怎么调都调不了的 ，因为你一个是你在那个操作系统本身

的设置的问题 ， 你这个你是改不了用户设置的嘛 ， 对吧 ， 我又不能检测到说这个用户说是这个不是点对点 ， 我弹个弹窗说啊 ， 你这个不是点对点 ， 你赶紧把那个点对点弄回来 ， 对吧 ， 这这也不现实 。

然后就是在做完这一套之后呢 ， 我就在在应该是前两周吧 ， 就在刷那个 Hacker News， 结果发现上面有有竟然有人在搞这个 XP.css， 什么意思 ，他要用 CSS 来复原当初的这个 Windows XP 时代 ， 就是那个那个什么 680640×480 像素的那个显示屏那种那种压那种 ， 就是那种那种那种像素感 ，不是我们现在追求的那种啊 ，其实也算是了 ， 只是说可能不是特别 ， 它是从英文那

个事件来来做的嘛 ， 就他也提到了说怎么用这个 web font 来来实现这种像素的感 ， 对吧 ， 包括是叫做呃 ， 就是拟真还原当年的那个 Windows 这个这个常用的那几个字体 ， 比如说像 Verdana， 像 Verdana 呀 ，Georgia， 还有像那个 Times New Roman 这些 ，在关掉这个次像素平滑的那个情况下， 实现出点对点渲染的感觉 ， 对吧 ，但是它其实没有 ， 它是用的也是用这个 ，因为刚才讲的那个 web

font， 它其实不支持这个呃真像素字体嘛 ， 就是都是也是伪像素 ，也是用那个丁丁卯的类似的手法 ， 就是把它做成矢量字 ，但是是那 trace 出来的点就是比较整数的 ， 那这样的它呃在 rendering 在 mas rasterize 过后都得到的还是一个像素化的感觉的嘛 。

就我看到有两个案例在做这件事情的 ， 回头我们可以把这两个案例放到这个 show notes 里面 ， 大家有兴趣的话可以点来看一下 ，但是我就觉得 ，因为它当然一个是因为拉丁字符的那个数量比较少 ，而且它那个点也比较好好弄嘛 ， 就是它的还原出效果还是比较高的 。

后来我想了一下说 ， 那我能不能还原出这个 ， 比如说我不还原这个 Windows XP 那种比较难的情况下， 我就还原一个这个以前那个叫什么 DOS 下面的那种什么 UC DOS 啊 ， 那个中文 DOS 环境那种感觉行不行 ， 对吧 ，但是就是因为刚才那个不能严格点对点的那个问题 ， 可能还不太好实现 ， 我们现在反正还在研究吧 ， 这个吴涛也在最近最近也在做类似

风格的事情嘛 ， 所以我们都刚好凑到一块了 。

**吴涛** [30:00]
对 ， 现在其实网上有好多那种在网页里面跑一个操作系统 ， 就是跑一个古老的拟真操作系统的那个效果 ，他们用的那个字体也差不多吧 ， 就是虽然不是完全一致 ，但也是那种就是古早的呃 PC IBM PC 机里面那个内内嵌的那种 ROM 的字体 ， 那个还是比较好的 。

**Eric** [30:19]
你刚才用 Canvas 直接把字体的渲染结果画出来 。

**吴涛** [30:23]
哎 ， 你你说这个思路倒是可以 ， 就是用那个就是那个呃 HDMI 5 那个 Canvas 那套 API 嘛 。

**Eric** [30:29]
对 。

**吴涛** [30:29]
然后直接在里面跑 ， 直接往上画 ，但这样就有个问题啊 ， 你那个文字就不可选了 ， 至少我们现在做的这种伪像素感 ， 它其实每个每个字都是可以都是非常 accessible 的 。

**Eric** [30:39]
对 ， 就他他们做那个拟真操作系统的这一套 ， 这帮人是无所谓这件事的嘛 ，但是如果你想要说我要做一个伪操作系统的风格 ， 同时又实际上是一个 accessible website， 那的确是非常难的 ， 至少你不能保证跨平台 。

**吴涛** [30:55]
对对对 ， 就这个就比较坑一点 。 所以我我但是我想了一下， 就是如果我的那个要求不是那么高哈 ， 我只是要求尽可能的像素的对齐 ， 就包括解决这个 ， 比如说现在我们那个首页 ， 它是一个用那个最新的那个 CSS3 的那个 grid， 那个就是 grid 就是网格排布嘛 ， 包括还不但是它就是说 ， 比如说我默认打开是一个三栏三列 。

**Eric** [31:17]
三栏 。

**吴涛** [31:18]
嗯 ， 对 ， 三三栏 ， 对 ， 三栏就比较难除嘛 ， 这就可能导致刚才我说的那个这个边缘有灰度 ，因为那个半个像素的问题 ， 对不对 ，但如果说有一个什么我我不用这个三栏 ， 我就用一栏或者两就双栏或者是就四栏 ， 一定通过这个就是 JavaScript 来实现的话 ， 那也可能实现说我能够指定到像素级别的这个宽度 ， 那至少你说在不同系统上它有一定的出 ，

它至少它多一个像素少一个像素 ， 它至少还是个整数倍嘛 ， 应该还是可以做的 ， 我觉得有有一些这个机会 。

**Eric** [31:50]
哦 ， 所以就这个是我们是吧 ， 官官网改头换面 ，其实就是都是在听了你们前一期节目的这个鼓噪下面实现的啊 ， 当然这里也非常感谢 Willy 帮这个过程中非常尽心尽力啊 ， 帮我们做了那么多的这个定制化啊 ， 然后我们也是第一个吃了这个螃蟹的人。

**吴涛** [32:10]
现在好像把网站做成 retro 风格是一个 somehow 是个潮流 ， 就是包括在在在文艺界也是有那个怎么叫文 ，在文艺界我我想的说在设计界也是 ， 现在好像兴起了那个 retrowave 这样一个一个风潮 。

**Eric** [32:25]
今年一直都流行 retro 啊 ， 对啊 ， 复古风 。

**吴涛** [32:28]
不对 ，但最近比如说那个蒸汽波 VIPERY 啊 ， 好像是这个名字 ， 就是特别流行 ， 这 90 年代的日本流行音乐配上那种什么美少女战士或者是超时空要塞的动画片 ， 然后现在各种各样的音乐全都被就是整成这个风格 ， 这太太 。

**Eric** [32:48]
就就而之前那个 ， 哎 ， 我在提顺便提个打个岔的事 ， 就是那个啊 ， 叫什么班班代 ， 呃 ， 中文叫什么 ， 就是那个百代是吧 ， 百百代在应该是去年年末的时候 ， 把他之前的一些老的那个 ， 就小时候我们看那些动画片全部给放 YouTube 上面去了 ， 然后我就去追了一遍那个那个叫什么来的啊 ， 魔神英雄传吧 ， 应该是那个自念传吧 ，是那个

有个有个这边有个山 ， 山有一圈彩虹 ， 什么什么创建山对吧 ， 然后有好多彩虹 ， 我把那个又看了一遍 。

**吴涛** [33:21]
不是应该是一个他驾驶一个类似像高达一样的机甲 。

**Eric** [33:25]
对对对 ， 类高达龙嘛 ，他有个龙嘛 ， 骑着龙 。

**吴涛** [33:28]
我记得他好像有个有个女主的那个名字叫 Himiko， 就是那个日本的一个女巫的一个名字 。

**Eric** [33:35]
对 ， 那个时候这个动画片小时候好火的 ， 就我们玩有一个女生就叫 Himiko， 我们给她起的 。

**吴涛** [33:40]
对 ， 昵称 。

**Eric** [33:42]
我我当时应该是上小学吧 ， 对吧 ， 小学几年级播放 ， 反正就是那个时候特别火 ， 一到那个播出的时候 ， 我就手搂电视机里面看 。

**吴涛** [33:50]
万人空巷的 。

**Eric** [33:51]
而且你放到现在看 ，他是做了那个高清重置 ， 我还不知道怎么 ， 反正看起来那个 YouTube 上面的效果还挺清楚的 ， 那我就追了一遍 。

而且这个片特别坑 ，他好像有有有三部 ， 然后都烂尾了 ， 就没有播完 ，不知道为什么 。

**吴涛** [34:05]
是在中国没有播完还是没有画完 ？

**Eric** [34:07]
就 YouTube 上也没有 ， 就我不知道怎么一回事 ，有可能是没有没有画完 。

**吴涛** [34:10]
有可能是没有画完 。

**Eric** [34:11]
那这个很坑 ， 然后这个故事到时候就我那天是他是先放的第一部 ，他是一周跟一集嘛 ， 一集也就十来二十分钟的样子 ， 然后我追都第一第一季还差两三集啊 ， 可能就追完了 ，他就放第二部了 ， 我说啊 ， 然后呢 ， 哈哈哈 ， 然后呢 ， 气死我了 。

**吴涛** [34:29]
需要付费解锁 。

**Eric** [34:31]
没有啊 ，他也没有这个选项啊 ，他是为了卖那个卖手办 ，他现在又在出那个那个那个那个机甲的那个手办嘛 。

**吴涛** [34:38]
哦 ，OK， 我想起来了 ， 那他们的机甲非常 Q 版是吧 。

**Eric** [34:43]
对对 ，他们机甲就很就是整个这个动画片都是那种萌系的 ，也比较萌系 ， 就 Q 系就特别搞笑的那种啊 。

**吴涛** [34:48]
对 ， 二头身的 。

**Eric** [34:49]
Q 版高达一样 。

**吴涛** [34:51]
对对对 ， 就我当时当时我应该是小时候最喜欢的动画片 ， 那个应该能排到前三吧 ， 这个 。

**Eric** [34:56]
天呐 。

**吴涛** [34:56]
所以就就又又在那就在那里那个附了骨一下 ，而他那音乐我觉得还他还挺好听的 ， 就是一直到现在都还记得那个 。

**Eric** [35:04]
感觉这一期播节目播出之后， 这个视频的点击量会大增 。

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

**Eric** [35:09]
就你看都是都是这个我们 IP 连过去 ， 我们那个 refer 过去的 ， 对不对 。

**吴涛** [35:13]
马兴 AU 点 Wataru， 对吧 ，他们那个叫 。

**Eric** [35:16]
对对对 ，Wataru，Wataru 是个什么意思 ？

**吴涛** [35:18]
男主的名字嘛 ，Wataru 是男主的名字 ， 就是一般写成汉字那个渡 ， 渡渡江的渡 。

**Eric** [35:24]
渡渡边渡的那个渡 ， 对吧 。

**吴涛** [35:26]
对 ， 就是他的名字 ， 对 。

**Eric** [35:28]
反正这这这个就是最近不是大家怀旧考古嘛 ， 特别多这种情况 ， 对不对 ， 然后那个最近也是在那个商场里面 ， 应该是疫情之前啊 ， 商场也看到很多那种国产复古的 ，也有你知道吧 ， 你们知不知道上海有那个大白兔奶糖 。

**吴涛** [35:43]
嗯 ， 这已经很久了吧 ， 这个十年前就出现了 。

**Eric** [35:48]
没有没有 ，他最近我一次我我们可能在其他地方有 ，但是我是记应该是去年， 就是 19 年末下半年在深圳才看到 ，他搞了一整个那个展厅的那种复古的 ，而且其实你仔细翻那个时候的那个排版和设计 ， 我觉得他做的还蛮好的 。

**吴涛** [36:02]
是啊 。

**Eric** [36:02]
就是大白兔奶糖的那套的这个设计 ，但不知道不知道是谁做的 ， 可以去可以去找找一期节目 ， 你们可以去考一下古这个当时是谁做的那个字体的这个设计啊 ，他那个全部都定制的 ，因为那个时候还没有没有什么数字化设计的 。

**吴涛** [36:16]
手工画的呀 。

**Eric** [36:17]
那个时候美术字的工 ， 美术字和平面设计的工底 ， 虽然条件非常简陋 ，但是最终水准是非常高的 。在 90 年代电脑普及之后， 就是这个个人桌面出版毁了平面设计 ， 可以说 。

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

**Eric** [36:32]
就出出自烂造 ， 对吧 ， 就叫做 low end 低端的纱布 。 哎呀 ， 当年就是所有的师傅都有手上功夫的呀 ， 就是后来就都都用电脑了 ， 大家就没有手上功夫了 。

**吴涛** [36:44]
对 ， 那个时候我去我跟老师去做校做校刊嘛 ， 做初初中还是高中校刊 ， 去一个印刷厂 ， 我那个 。

师傅的手艺真的令人叹人叹为观止 ， 就是从一个剪贴画那种 ， 就是他实际上是一张一本很厚的书 ， 然后里面每页都是那种半透明的剪贴画 ， 然后他从上面裁一下， 然后贴在一个板上， 然后问你这样行不行 ， 然后再去排版 ， 然后最后把它印出来 。

那个那个手艺真的让人非常叹服了 ， 那绝对是就是你看现在一个人敲键盘晃鼠标做出来排版 ， 那感受是完全不一样的 ， 是一种有那种匠艺的冲击在里面 ， 就好像你看一个什么 ， 看一个什么 letterpress 的 letterpress 的那种那种那种印刷机一样 ， 就是赏心悦目啊 。

我想想 。

**Eric** [37:30]
那时候都是那个这这剪刀功夫啊 ， 剪剪贴贴啊 ， 都是 。

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

**Eric** [37:35]
嗯 ， 对 ， 就是那天我就是在逛商场的时候看到那个大白兔 ，他搞的那套东西嘛 ， 然后我就仔细想想 ，其实小时候就是光吃那个糖 ，也没在乎没在意那个包装纸嘛 ， 然后他那个时候就是那个他卖的那个糖里面的那个包装纸 ，因为我估计应该是成本和这个工艺的考虑啊 ，他那个其实不是特别的这个清晰哈 ，他现在他都是全部用这个最新的

这个工艺做出那个原来那个那个图样嘛 ， 所以你仔细看他非常就是在现代工艺下面他非常清楚 ， 然后那个边缘啊那些都做的非常好 ， 我觉得这个仔细看那个配色都都搭的挺棒的 。

**吴涛** [38:08]
大白兔的兔毛看了一眼 ， 哈哈哈 。

**Eric** [38:12]
有毛吗 ， 那个没有毛吗 ？

**吴涛** [38:14]
就把它给我们 。

**Eric** [38:15]
有个清版大白兔 。

**吴涛** [38:16]
有一个版本是有毛的 ， 对 。

**Eric** [38:18]
特别搞笑 。 哎 ， 哎 ， 等等等等 ， 这个我们我们这期节目聊啥主题来着 ？

### 文件命名

**吴涛** [38:25]
哪去了 ？

**Eric** [38:26]
哎 ，不过啊 ， 我们内核恐慌啊 ， 这次哈作为这个丁卯点阵体的这个案例呢 ， 我其实已经在我们 The Type 的会员的 5 月份哈 ， 这一期里面介绍了啊 ， 所以呢 ， 大家如果在会刊里面也可以看到我们这次改版后的内核恐慌的这个网页的效果 。

**吴涛** [38:46]
啊 ， 感谢感谢感谢推荐 ， 我们发我们回去看一下这个能有多少个点击过来 。

**Eric** [38:51]
哈哈哈 。

**吴涛** [38:56]
是是所以刚才讲了那么多这个与主题无关的事情 ， 我们这期节目再聊一下 。

**Eric** [39:01]
还算是有关吧 ， 勉强可以牵扯上 。

**吴涛** [39:04]
OK， 好的 。

**Eric** [39:06]
但是不是今天的主题啊 ， 我们今天主题讲什么 ？

**吴涛** [39:08]
这个我想想这个怎么描述 ，其实这个今天这个主题呢 ， 跟我们之前串台的好几期节目都是有或多或少的关联的 ， 对吧 ？

**Eric** [39:16]
千丝万缕的关联 。

**吴涛** [39:17]
那当然了 ， 我这个都是想好的 ， 都想很长时间酝酿的呀 。

**Eric** [39:22]
都是有计划的 ， 对不对 ？

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

**Eric** [39:24]
冥冥之中早已注定 。

**吴涛** [39:26]
计划来得比划快 。

**Eric** [39:26]
哈哈哈 。 Eric 君是非常用心的 ， 就像我们两个就每次来都是像打酱油一样 。

**吴涛** [39:32]
我们都是很很很欢乐的在打酱油呀 。

**Eric** [39:34]
对 ， 我我们是双重捧人。

**吴涛** [39:37]
但是你们很你们能你们很能说呀 。

**Eric** [39:40]
对 ， 我是我们是之前串台时候讲过那个 Unicode 的各种问题哈 ， 然后包括应该有一最开始第一期也讲过什么 ， 就是你在键盘上按下一个按键 ， 那个字怎么出现在屏幕上， 这整个过程的 ， 对吧 ？

但其实今天讲的这个话题呢 ， 跟这两件事情或多或少是有一定关系的 ， 对吧 ？ 就是说文件系统啊 ， 大家如果还知道这个什么叫文件系统的话 ， 现在应该很多这个 00 后没有用 PC 或者 Mac 的话 ，他可能不 。

**吴涛** [40:07]
Mobile first generation。

**Eric** [40:08]
对 ， 就是就是 mobile first， 这这一代应该已经不知道什么是文件系统了 。 文件系统呢 ， 就是你打开这个所谓的资源管理器 ， 对吧 ， 能看到那个东西 。

反正你在像我跟吴涛这个啊 ， 这个装团的人呢 ， 就还知道哦 ， 还可以有一个命令行 ， 对吧 ， 然后能看到这个路径什么什么的 。

对 ，但文件系统我们不是聊他本那些其他各种各样的怎么用啊 ， 怎么那些关系 ， 我们只聊一个事情 ， 就是文件系统怎么命名的问题啊 ， 就是一个文件到底它可以叫什么 。

**吴涛** [40:38]
嗯 ， 然后其实我们也可以扩展到这其他的嘛 ， 就是关于各种云代码 ， 还有那个语言啊 ， 就是我们会涉及到这个命名的事情 。

那英文它叫做什么 naming convention 吧 ，是吧 ？ 它给它叫命名规则啊 ，其实会有各种各样的命名规则 。 对 ， 嗯 ，但是像因为我大家都是 Mac 用户吧 ，Mac 几乎都都没有规定 ， 就不会存在这个事情 。

但是以前在很早很早以前 ， 我们在学命令行的时候 ， 还在学 DOS 的时候 。

**Eric** [41:11]
有各种各样的那个制度要遵守 ， 对吧 ？

**吴涛** [41:14]
对啊 ， 那时候哎 ， 你们还记得有时候 8.3 规则吗 ？

**Eric** [41:18]
对对对对对 ， 这个是啊 ， 这个要我想想一下， 这个得要在呃 Windows 95 之前时代的哦 ， 应该是 Windows 32 时代的时候 ， 大家都要遵守的一个事情 ， 对不对 ？

**吴涛** [41:29]
从 Windows 3.1 开始支持了长文件名 ， 应该是 ，但是为了向下兼容 ， 或者说呃 ， 或者对他做了一套向下兼容的方案 ， 就是他这个文件名在 DOS 下面显示的时候 ， 还是会显示成 8.3。

**Eric** [41:42]
还是用一个波浪号来展来来来显示 。

**吴涛** [41:45]
一个波浪号加一个数字 。

**Eric** [41:46]
你们要跟大家解释一下什么叫 8.3， 好吧 ，anyone。其实我觉得要解释 8.3， 先要解释什么是扩展名 ，因为其实 Mac 上， 比如说怎么现在 Mac 上面默认的情况下， 它是不显示这个扩展名的 ， 对不对 ？

**吴涛** [41:58]
因为 Mac 其实即使没有扩展名也可以 ，也成立 ， 就是在 Mac 上面 ，但是 Windows 不行啊 。

**Eric** [42:04]
是这样的 ，是这么来的 ，Windows 呃 ， 扩展名这个东西最早实际上是 70 年代的一个一个发明吧 ， 当时那个操作什么 CPM 应该叫 control 什么 ，DC 是 control， 我只记得 C 是 control，CPM 就是 DOS 的 ，DOS 是从 CPM 抄过来的相当于 ， 然后 CPM 有扩展名这一项 ，因为 CPM 的创就是创始人认为在和文件相关的所有的元数据里面 ， 类型数据是最重要的 ， 所以类型数据应该是文件名的一部分 。

**吴涛** [42:34]
嗯 ， 这其实这里是一个哲学问题啊 ， 就是说一个文件的扩展名 ， 它其实是定义这个文件是一个什么样的种类 ， 对不对 ？

然后这个种类这个信息是否是应该体现在这个名字里面 ， 还是说体现在一个什么别的地方 ， 比如说刚才啊 Eric 也提到 ，其实 Mac 里面你不用扩展名也还可以 ， 对吧 ？

它因为它有一些别的方法可以判断这个文件是一个什么样类型的文件 ， 比如说我们啊常见那个方式有一个什么 magic number， 对吧 ， 就是在文件开头可能有几个字 。

**Eric** [43:02]
Mac 我想 Mac 是怎么实现的 ？Mac 在资源它一个叫中文叫什么资源差 ， 它叫 fork 嘛 ， 就是在很早以前就是 。

**吴涛** [43:12]
这个就更复杂了 。

**Eric** [43:14]
Fork 好像是经典呃 ， 就是 Mac classic 里面那个概念 。

**吴涛** [43:18]
对 ， 就 classical 嘛 ， 对啊 ， 嗯 ，因为你那个 OST 后面又又不又不一样了 。

**Eric** [43:22]
因为 OST 本质上是个 Unix。

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

**Eric** [43:24]
Unix 的哲学就是这个文件是不是可执行文件 ， 那我让它可执行 ， 给它可执行的权限 ， 它就是可执行文件喽 。That's it。

**吴涛** [43:31]
嗯 ， 然后 Unix 实际上是不把元数据 ，不把文件类型是什么 ， 这个元数据存在任何地方的 ， 就 Unix 里面上面专门有一个命令叫 file 嘛 ， 你用 file 它是一个启发式的探针 ， 它会去看这个文件看起来像什么 。

**Eric** [43:45]
去猜嘛 。

**吴涛** [43:46]
That's it。

**Eric** [43:47]
对 ， 就是怎么判断一个文件像什么 ， 就是它有很多方法嘛 ， 就是如果不看文件名的情况下啊 ， 就是说你看可以看文件头部 ， 对吧 ， 它通通常一些这种文件格式 ， 它在头部都会有一些特殊的一个标记或者一个什么结构 ， 对吧 ， 它会说这是一个图片啊 ， 这是一个什么 Word 文档 ， 这是一个什么 MP3 的一个音频 ， 举个例子哈 ，是这样的 。

**吴涛** [44:06]
就是就是好像后来还衍生 ， 就是因此而衍生出了一些所谓 polyglot 文件 ， 就这这个文件同时是很多种东西 ， 比如说它同时是一张照片 ， 然后同时嗯 ， 然后又是一个 RAR 压缩文档 。

**Eric** [44:20]
对对 ， 这种就是属于那个专门专门制作出来的这种呃 hack 嘛 。

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

**Eric** [44:26]
啊 ，但其实说回来就是说那呃 Windows 里面采取的一个方法 ， 就是说我它 Windows 上面没有没有像类似刚才你说那个 file 这个命令 ， 它其实没有对应的东西 ， 对吧 ， 它就是说我怎么知道这个文件是个什么类 ，是个什么东西呢 ，是个什么种类呢 ？

**吴涛** [44:40]
你告诉我喽 ，有用户告诉他 。

**Eric** [44:43]
就是你对啊 ， 你告诉我喽 ， 你在这个名字最后加个你说点 jpg， 那可能就是一个压缩的图片 ， 对吧 ， 要是个点 mp3， 那可能就是一个这个音频文件 ， 对吧 ， 你要是点个 mp4， 那就是个视频 ， 对不对 ， 然后就诸如此类啊 ， 就是搞了这么一套这个扩展名这么一个概念来描述这件事情 ， 然后嗯 ，DOS 我记得当时 8.3 是因为它只能存 11 个字符宽 ， 对吧 ，8 个名

字加一个点 ， 再加 3 个字母的这个扩展名就就齐活了 ， 最多就这样 。

**吴涛** [45:14]
所以当时的文件名最多只能是 8 个字符 ， 然后扩展名呢 ， 最多呢也就只有 3 个字符 ， 就就 DOS 里面它的这个呃这个限制非常严格 ， 所以就简称 8.3。

**Eric** [45:27]
哎 ，其实我我当时一直我一再想不起来了 ， 就是说最多 3 个 ， 那其实当时一个或者两个用的多吗 ？

**吴涛** [45:33]
点 C 啊 。

**Eric** [45:35]
啊 ， 对啊 ， 点 H 啊 。

**吴涛** [45:37]
哈哈哈

。

**Eric** [45:40]
OK。

**吴涛** [45:40]
你都不用投啊 。

**Eric** [45:42]
哈哈哈 ， 明白明白明白 。

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

**Eric** [45:45]
呀 ， 所以现在就是讲说我们今天讲这个命名嘛 ， 那命名的话 ， 首先是一个文件名的长度问题 ， 对吧 ， 呃 ， 所以像刚才说的像 DOS 的它的先嗯限制的是只能有 8 个字符 ， 然后后面呢 ， 到 Windows 后面就最多是就可以有 255 个字符了 ， 那个多长也可以啊 ， 然后扩展名的话 ， 嗯 ， 好像像后面给 4 个字母也可以了 ， 对吧 ， 反正 Unix 的话是随便的都无

所谓的 ， 那个那有有几个字母都无所谓 ， 对吧 。

**吴涛** [46:17]
Unix 实际上实际上也没有扩展名这个概念 ， 只不过后来扩展名这个扩扩展名这一套东西 ， 归根结底还是有它意义 ， 还是有意义的 ，因为你人不可能去查看文件的额外的 metadata， 人只能能人能看到的基本上就是一个呃文件名 ， 所以文件名作为扩展名作为它一套还是有还是有意义的 ， 所以在后面呃 Unix 和 Mac 之类也其实也都怎么怎么说 ， 从善如流 ，

随大流 ， 把呃扩展名当成了文件的呃类型判断机制的一部分 ，但是归根结底 Linux 上面实际上是没有扩展名这概念的 ， 就跟 Mac 一样了 。

**Eric** [46:58]
嗯 ， 哎 ，其实你们想没想 ， 这可能是这个叫什么来着 ， 就是图形界面的一个问题还是怎么着 ， 就是你在一个纯命令行的界面下面 。

CLI 嘛 ， 我们叫 command line interface， 交互的方式是一定是一个叫怎么叫动兵结构 ， 对吧 ， 我就说先敲一个命令 ， 然后执行什么样的一个参数 ， 就是那个参数就是那个文件名嘛 ， 就是说这个时候你已经知道了你要用什么东西去处理这后面那个那个冰雨 ， 对吧 ， 那个那个文件 ，但其实你在这个呃比如 Windows 里面 ， 你是要有一个这么一个概念 ， 就是比如你在那个资

源管理器里面 ， 你你双击一个图片 ， 你的想法是把它打开 ， 对吧 ， 这个时候你有个暗含的假设是说你用什么把它打开 ， 这里存在一个就是绑定的一个关系 ， 对不对 ， 它不是一个动兵 。

**吴涛** [47:44]
对 ，Windows 打开文件的机制也是跟那个扩展名相关的嘛 ， 它在注册表里面把所有的扩展名对应了一个打开工具 。

**Eric** [47:53]
所以就很蠢呐 ， 很死板呐 ， 就这里面就是一个哲学问题嘛 ，是你先想到了用什么工具 ， 你先想到用什么东西打开 ， 然后你再去找那个文件 ， 还是说你先找到那个文件 ， 然后你要你要用这个 ， 你要用你要打开这个文件 ， 然后再想这个这个文件是有对应的是一个什么工具来打开 ， 就这里面我觉得有一个这个逻辑的前后的一个关系 ， 对吧 。

**吴涛** [48:17]
而且像 Mac 的话 ， 它没有这个扩展名 ，是因为它其实是它是那个 GUI 的图形设 ， 然后呢 ， 它把这些东西啊 ， 它不不用写在 ， 就是不用当成扩展名写在文件名里面 。

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

**吴涛** [48:31]
比如说就老的那个 Mac，他们是他他用那个 fork 嘛 ， 就是那个 resource fork 资源差嘛 ， 它其实是写在文件里头的 。

**Eric** [48:38]
这个概念可能要要给大家解释一下， 这个东西其实很 ， 除非你对这个底层非常了解啊 ， 你不然其实你根本不会想到这么一个结构 ， 就是这个这个 resource fork 到底是个啥 。

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

**Eric** [48:50]
其实你你这么想 ， 你创建了一个空白的一个文本文件 ， 对吧 ， 嗯 ， 然后这个文本文件在一个最普通的一个文件系统里面 ， 它能记录啥 ， 这个文件叫什么名字 ， 对吧 ，有些元数据什么是什么时候创建的 ，有多有多大尺寸 ， 然后就是文件的这个所谓的内容了嘛 ， 就是假设空的话 ， 就是一个零字节的 ， 就是零长的一个内容 ， 那这个时候你会会想说 ， 那

这个文件是什么类型 ， 这个信息到底存在哪里的问题 ， 对吧 ， 刚才我们开开始讲了这个 DOS 和这个 Windows 的方案是说存在这个文件的扩展名里面 ， 对吧 ， 就最后那个点的后面那个就是文件的扩展名 ， 那这个信息就已经包含了 ， 然后这个 Mac OS 就是不是我们现在就就叫叫做 Mac OS ten 的这么一个版本 ，而是说比如说是啊 Mac OS 七八九 ， 这个时候它

其实在文件系统里面有一个专门存储这种元信息的元数据的地方 ， 这个地方叫做叫做这个资源差 resource fork， 这个时间细节比较比较墨迹 ， 就是它是在独立于这个文件本身之外的一个地方去存储这个信息的 ，有了这个东西之后， 那你的扩展有没有这个扩展名其实已经不重要了 ， 对不对 ，因为这个这个文件类型是存在那个元数据那个资源差里面的 。

**吴涛** [49:56]
它这样的对应就比较灵活嘛 。

**Eric** [49:58]
对 ，但这样也就是有一个代价 ， 就是它其实首先它跟别的系统的兼容性就比较差 ， 比如你把一个文件从从 ，但那个时候没有没有什么网络 ， 可能这种情况倒不是特别常出现 ，但你知道现在就说你要把这个文件啊 ， 比如从那个经典版的 Mac OS 发到一个这个 Windows XP 上面或者 Windows 95 上面去 ， 这个时候那个资源差是一个 Mac OS 的实现细节嘛 ， 它在 Windows 上面是没有的

， 这个时候你怎么办呢 ？

**吴涛** [50:21]
所以经常会把这个 Mac 的文件拷到 Windows 上， 会多出来一套东西 。

**Eric** [50:27]
对嘛 ， 对嘛 ， 就包括你现在用那个呃 ， 我们可能下期节目讲 NAS 的时候啊 ， 就是呃 ， 我们之前不是有些讲过 NAS 嘛 ，但其实没有提到这个问题 ， 比如说因为现在基本上所有 NAS 系统都是以这个 Linux 系统或者是 Windows 系统为主的嘛 ， 你一个 Mac 的客户端去访问这个 NAS 的时候 ， 那它的那个资源差又又变成什么了 ， 对吧 ， 就变成你之后刚才的那个问题 ， 变成两

个文件 ， 一个文件复制过去变成两个文件 ，有一个文件是描述它元数据信息的 ， 然后那个文件呢 ，在其他系统上是没有用的 ， 就跟就跟垃圾一样的 ， 只有 Mac 能用 。

所以就是从从别的那个超大系统角度来看 ， 这个 Mac 的用户就是一个到处乱扔垃圾的这么一个人， 对吧 。

**吴涛** [51:08]
就我觉得两方两方互相都看对方不顺眼吧 ，Windows 不是会留下那个什么 sumnile 啊 。

**Eric** [51:13]
Mac 也会啊 ，有那个 DS 叫什么 DS store 吧 ，是不是 ？ 那个也是一个 ， 就是点 DS store 开始的 。

**吴涛** [51:19]
一个文件夹会多多一个出来 ， 一个文件夹每个文件夹都会有一个非常烦人的 ，也是像 SVN 一样的 ， 很烦人。 嗯 ， 对啊 ， 扯扯远了 ， 就是这些都其实都是考古了 ， 对吧 ，其实包括这个今年的 Mac OS， 我相信应该我们你们有谁用过今年版 Mac OS 吗 ？

我是没用过 。

**Eric** [51:36]
我用过 ， 我只在我只在虚拟器里跑过 。OK。

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

**Eric** [51:40]
然后这个呃 ，Windows 95 之前的版本 ， 这个我们应该还都用过吧 ？ 我们都用过 。

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

**Eric** [51:48]
我当年还用 WPS 排版呢 。 哎呦 。WPS 是图形版还是这个 DOS 版 ？

**吴涛** [51:54]
DOS 版的啊 ，UCDOS 进去的啊 ， 用智能 ABC WPS， 然后暴露了年龄哈 ， 我们都是用过那个时代软件的人。

**Eric** [52:02]
哈哈哈 。

**吴涛** [52:02]
而且还不是那个 Wizig 的 ， 这都是要预览预览再预览 。

**Eric** [52:07]
等等啊 ， 那个时代除了 WPS， 还有一个 CLI 界面下的排版工具 ，CCDE 还是叫什么 ？ 啊 ， 对对对 ， 对对对 ，CCDE 还是叫什么 ？

**吴涛** [52:17]
四个字母 。

**Eric** [52:18]
CC 啊 ， 对对 ， 没错 ，是的 ，有的 ， 对 。 嗯 ，但是我们我没有主要我没用过那个 ， 对 ， 我知道 。 嗯 ，但是没用过 。

哎 ，其实你你那个想来那个时候还是蛮高级的 ， 那个时候因为不能所见即所得嘛 ， 就是纯那个字符界面的情况下， 你其实是在写 markdown 差不多这种感觉 ， 对不对 ？

**吴涛** [52:33]
是的啊 ， 然后我们做个花边都要脑补的 。

**Eric** [52:36]
啊 ， 对对对 ， 我查到了 ，CCED 是一款中文字表处理软件 ， 问世于 1988 年， 由原北京前为天电子技术研究所开发 ， 主要开发者是朱重军 。

软件在 DOS 时代曾经是中国最流行的文字处理与电子表格软件之一 。1998 年之后出现了 ， 甚至出出现了基于 Windows 的版本 。

**吴涛** [52:55]
哈哈哈 。

**Eric** [52:56]
连续多年是中国最畅销的软件之一 ，是中国是全国计算机等级考试以及国内不少计算机教育培训的指定内容 。

我的天呐 ， 你们想一想 。 我用那个打印过 ， 连连连那个真实打印机打过东西 ， 就打过文档 ， 确实还用过这个东西 ， 非常上古的感觉 。

**吴涛** [53:14]
后来 WPS 批了 ， 对 ， 这里面写了老对手 WPS 借助中国政府采购计划会恢复了生机 ，但 CCED 市场就萎缩了 。

等等 ，2010 年 2 月份 ，CCED 2,000 版发行 。

**Eric** [53:27]
哦天呐 。

**吴涛** [53:29]
Oh my god， 我要去我要去收一套 ， 我简直 。

**Eric** [53:33]
要要还要看那个还下旧的至少 。 哎 ， 等下怎么扯到那里去了 ？ 哈哈哈 。 说说回来 ， 说回来 ， 呃呃 ， 就其实这几个 ， 我们刚才提的那几个古早的操作系统线其实基本上都没有了 。

我们现在目前主流用的还是这个 Windows 的 ， 应该是 Windows 10， 对吧 ， 或者是至少是 8 以后的吧 ，8 和 10 这种 。

好 ， 这个 Linux 桌面现在还有人用吗 ？ 其实还比较少哈 ， 所以这个先不算 。 呃 ， 然后就是这个 Mac 了 ，Mac OS ten 应该说是准确的说是 。

**吴涛** [54:05]
嗯 ， 现在叫 Mac OS 了 。

**Eric** [54:07]
呃 ， 所以这两个系统 ， 我们其实它给的我们限制其实就没有那么多了 。其实你可以是文 ， 我记得文件名可以起到多少来着 ？

**吴涛** [54:16]
长度哈 ， 你说 。

**Eric** [54:17]
对 ， 长度是可以很长的了已经 。 对 ，但扩展名这个事情在各个系统上面我现在都基本上都保留下来了 ，不管是在啊 Linux 上面还是在 Mac OS 上面 ， 还是在这个现在 Windows 上面 ， 就基本上扩展名这个事情都已经成为一个约定俗成的东西了 。

但只是说就刚才说那个区域嘛 ， 就是它默认是在图形界面下哈 ， 它是展示还是不展示扩展名的问题嘛 。

应该我记得 Windows 目前默认应该是不展示的 。

**吴涛** [54:41]
Mac 也是默认不展示的 。

**Eric** [54:44]
然后 Linux 的桌面我就不知道了 ，因为太多了 ， 然后也也没不常用 ，以及所以就这两个都是默认不展示 ， 就变得很尴尬 ， 对不对 ？

本来这个东西是是为了说刚才武涛也讲了嘛 ，是为了让让这个用户一眼能看出这个文件是个什么类型的东西 ， 对吧 ？

但其实因为有了这个叫什么图标 ， 就是那个 file icon 啊 ， 就是文件类型的图标和它 ，因为如果你按那个叫什么多列排布的 ，其实不叫多列 ， 就是那个按列排布 ， 按列不叫按列 ， 按列排布 ， 它有可能多个嘛 ， 它是应该是表格式吧 ， 表格式的那个 ， 它有一栏 ， 它本来就会显示这个文件是什么类型嘛 。

所以啊 ， 就有了这这两个大概一个是那文件图标 ， 一个是文件类型 ， 单独有一列显示的情况下， 这个文件名的这个扩展名其实又变得不重要了 ， 对不对 ？

那其实当初就不要搞扩展名嘛 。

**吴涛** [55:30]
对 ， 就就好像 Windows 后来就默认隐藏扩展名 ， 对吧 ？ 刚装好的时候默认是会隐藏扩展名。

**Eric** [55:37]
XP 开始就默认隐藏了吧 ， 应该是还是之后还是 Windows 98 开始 。

**吴涛** [55:41]
我就觉得扩扩扩展名是一个很蠢的一个办法 ，而且而且它特别死板嘛 ， 就刚才说嘛 ， 它和那个应用应用程序化只能一对一嘛 ， 像呃 Mac 系统它是不用这个的 ，而且它甚至因为它通过图标来体现嘛 ， 甚至它那个图 ， 它那个资源 fork 的话 ， 它因为有更详细的一个定义 ， 它还可以比同样 ， 比如说是 Illustrator 的的 AI 的一个文件 ， 它还它那个图标可以体现出 AI 的版本的

不同啊 ， 就是它它可以体现在图标上面 。

**Eric** [56:12]
就同样都是点 AI，但是有个显示的 AI， 比如说是 5， 一个显示 AI 8 这种 。

**吴涛** [56:17]
对 ， 没错 。

**Eric** [56:17]
啊 ， 这个这个就可以 ， 它可以分叉 ， 可以加好多都好好多内容进去的 。 嗯 ， 然后呢 ， 这个东西只要体现在图标上就行了 ， 然后最后给用户的信息是一样的嘛 ， 对用户来讲 ， 哦 ， 这的确就是一个 AI 的这个版本的一个文件 ， 它达到这个效果嘛 ，并并不一定要用 ， 比如说这个三个字母 ， 还还得让用户去得记这个三个字母是还对应什么东西 。

**吴涛** [56:40]
所以它其实如果这么来看哈 ， 它文这个就是文件扩展名这个事情 ， 它其实是字符界面向图形界面过渡这个时期的一个一个副产物 ， 对吧 ？

因为因为在那个字字符界面下面 ， 你是没有图标来告诉你和这个文件是什么类型 ，也没有这个多列的这种就是就是复数信息的展示 ，因为那个字符界面一般的那个比较窄嘛 ， 就那个栏比较窄嘛 。

所以这种情况下， 呃 ，在这个过渡时期把这个文件扩展名这个概念给保留下来 ，但其实到现在发现其实已经完全没有作用了 ， 对不对 ？

就可能是反效果 。

**Eric** [57:13]
Mac 它之所以要用这个扩展名 ， 就是完全屈服于这个网络时代信息 ， 呃 ， 这个文件交换的时候 ， 呃 ， 必须要服 ， 呃 ， 就是屈服于这个 Windows 这个蠢的办法 。

**吴涛** [57:24]
必须那个更强势一些嘛 ， 用的人更多嘛 。 对啊 。

**Eric** [57:27]
所以这个就很就是很一个典型的 ， 就是向低看起的一个典型的案例嘛 。 就我们很多东西就是好的技术并不并没有得到发现 ， 大家都是用一个很蠢的技术 ， 然后再流行起来的 。

**吴涛** [57:38]
对 ， 刚才还说到就是说 ，因为现在这个图形界面都是默认隐藏隐藏这个文件扩展名的嘛 ， 它其实有一个比较重要的点 ， 就是说呃 ， 你比如说你在呃 Windows 里面好还是 Mac 里面好 ， 默认情况下你要改一个文件的名字 ， 你怎么改 ？

你就是选择那个文件 ， 要不你右键点击改名 ， 或者是你就像我们这种键盘比较键盘比较熟溜的人哈 ， 你就直接按回车 ， 它就一般可以改名了嘛 ， 对不对 ？

然后这个时候因为它不显示这个文件的这个扩展名 ， 你默认改的就是所谓的文件名 ， 就是就是狭义的文件名啊 ， 就是不不含扩展那部分的前缀那部分 。

但其实如果说你你像我们都喜欢 ， 就我比如说我至少是这样的 ， 我不知道你们的默认设置怎么 ， 我一定会把那个文件的扩展名展示出来 。

我不知道为什么保留这个习惯 ，但是就是看起来 ，因为我可能有可能是因为我要经常在这个呃字符界面和呃这个图形界面间切换嘛 ， 所以还是有这个需求看到那个文件扩展名是什么的 。

那这种情况下呢 ， 你如果要改名 ， 它其实也有很多小小技巧的 ， 比如说我现在试一下给你们看哈 ， 我记得应该是这样子 ， 比如我现在我打开一个 Mac， 我要改一个文件名 ， 然后这个时候我是显示的一个是显示带扩展名的文件名 ， 我要点我按回车 ， 它默认会把文件名的部分给我选中 ，但是扩展名是保是点 ， 就扩展名和那个点的部分是不动的

。 什么意思呢 ？ 就是说它不想让用户错误的更改掉这个扩展名 ， 对 ， 把文件类型 。

**Eric** [59:08]
对对对 ，因为其实虽然说我们刚才讲 ， 虽然说这个文件类型不重要 ，但是如果说你用户明确的说我要把这个文件改成那个类型 ， 比如说很简单一个道理啊 ， 你现在去网站网站上下载一张图片回来 ， 还有可能下下载那个 ，因为现在很多那个网站的那个图片 ， 它本来就没有想给你下载 ， 对吧 ？

它的那个文件命名也不是按照这个什么有有扩展名的方式来弄 ， 你就下来就是一个普通普通空白的文件 ， 对吧 ？

但这个时候因为那个是一个外部系统来的来来的一个文件嘛 ， 这个我的这个母系统又不知道这个文件是个什么东西 ， 它就会显示一个一个叫做什么 ， 一个啊 ， 一个 generic file， 一个一个通用的一个文件放在那里 ， 就不知道是它是个啥 ，不知道是个图片呢 ，也不知道是个视频呢 ，也不知道是个音乐还是什么东西 ， 对不对 ？

这个时候我就说那我要强行给它加一个扩展名 ， 告诉我这个系统说啊 ， 你把它当做一个图片 ， 或者你把它当做一个呃这个音频 ， 对吧 ？

然后你再做对应的事情 。 这个时候我就不知道这个什么时候能启动那个类似于这个 file 这个机制去探测这个文件是个什么样的类型嘛 ， 对吧 ？

这里面其实还是有很多讲究的 。

**吴涛** [1:00:10]
嗯 ， 所以呢 ， 从 DOS Windows 转过去再用 Mac 的时候 ，在 Mac 当年就因为它无所谓扩展名 ， 扩展名可以随便改 。

嗯 ， 然后这个对于我们从 DOS 转过去的就觉得哇 ， 这个都能改的太可怕了 。

**Eric** [1:00:24]
你说这个我想到一个问题 ， 就是 Mac 上面呃有时候会出现 ， 比如说嗯一个一个文件它没有扩展名 ， 然后 Mac 会自动去试图去猜这个文件是什么 ， 就是尤其是在你按下空格的时候 ， 呃 ， 然后这就导致了很多人在呃 ， 尤其是就就是对电脑系统不是那么在行的人， 会会经常呃 ， 我就我遇到这个问题 ， 就是会有人给你很多没有扩展名的文件 ，在他电脑

上显示一切正常了 ，但到你这就不行了 ，因为没有扩展名。

**吴涛** [1:00:54]
对 ， 这个时候其实发现有就如如果一旦一涉一旦涉及到这个文件的交换哈 ， 这有有个扩展名明确的规定这个文件是什么样的这个类型 ， 然后至少缩小一个范围吧 ， 然后让我们再去处理 ， 还是会容易很多的 。

**Eric** [1:01:09]
对 ，有很多事情你会觉得说这样是方便用户 ，但实际上会会苦了开发者 。 这是这是一个两面的问题 。

**吴涛** [1:01:18]
所有的软件设计不都这么干的吗 ？

**Eric** [1:01:19]
都是这样的 。

**吴涛** [1:01:20]
方便用户 。

**Eric** [1:01:21]
对 ， 要关着用户的呀 。

**吴涛** [1:01:25]
是的 。

**Eric** [1:01:27]
好吧 ， 那我们文件名的长度差不多这样 ， 我们我觉得这个扩展名的坑太深了 。 哎呀 ， 这个每次讲不完 ， 我们本来今天重点不是讲这个的 。

**吴涛** [1:01:35]
嗯 ， 这个讲了这么久这个坑 。

**Eric** [1:01:38]
哈哈哈 ， 对啊 ， 对 。 下面我们来谈更大一个坑 ， 就是是文件名命名是否允许包含空格的问题 。

### 空格之痛

**Eric** [1:01:46]
哎呀 ， 这个事情就特别扯了 ，因为大家也知道我们所有的这些系统的话 ， 都是从嗯西方语言过来的嘛 ， 那像西文化他们都是按词分写的 ， 词和词之中间都是有空格的嘛 。

**吴涛** [1:01:59]
嗯 ，是嗯 ， 我记得 DOS 的文件名是不允许有空格的吧 ？

**Eric** [1:02:04]
应该是不允许的 。

**吴涛** [1:02:06]
嗯 ， 我有点不太记不清楚了 。

**Eric** [1:02:09]
所以就是我我学电脑开始就是从 DOS 进来的 ， 所以哪怕直到现在我起我自己起文件名还是不习惯选用空格 。

我会比如用什么呃用 hyphen 用连字符啊或者下划线来写 。

**吴涛** [1:02:25]
啊 ，OK， 我上次看一个视频就是一个他叫什么 ，他叫 Bobby It Be Guy， 就是他在他在视频里面教你装一个呃 Mac OS Classic 的操作系统 ， 然后他很自然而然的把那个呃主硬盘命名完了 ， 命名为啊 IMac 空格 HD， 然后我就我就想 ， 我就感叹说果然是祖传 Mac 用户 ， 从来不会在意这个名文件名里面可有用可能不能有空格这种问题 。

你要是这种古早的 Windows 用户 ， 你绝对不可能做出这种事的 ， 就是把一个文件对命名为一个带空格的名字 。

**Eric** [1:03:05]
因为有有空格会有什么问题呢 ？ 就是在早年的这个呃命令行 ， 就是字符界面的时候啊 ， 它比如说我要处理 ， 就比如说我们想象一个什么场景 ， 就是复制吧 ， 我要把这个假设我有一个文件叫做 a 点 txt， 我要把它复制为 b 点 txt， 我直接就像什么 ， 就是这个 CP 就 copy 对吧 ， 然后 a 点 txt， 然后到这个目标是 b 点 txt， 就是完成了 ， 对不对 ？

但你发现这三个部分哈 ， 一个主语 ， 两个宾语嘛 ， 对吧 ？ 这个动词 ， 这一个动词 ， 对 ， 然后你两个这个 object 嘛 ， 两个目标的时候 ， 你发现它用什么分隔呢 ？

用空格分隔 ， 对不对 ？ 这个时候你说哎 ， 那我的文件是刚好是 a 空格 b， 这个时候怎么办 ？ 这很尴尬 ， 对不对 ？

但其实也是有解决方案的 ， 就是说你把那个带空格的名文件名用引号引起来不就好了吗 ？ 对吧 ？

那其实你也可以说是 copy 空格 ， 然后引号开 ， 就是引号 ， 然后 a 空格 b 点 txt， 然后引号 ， 然后就下一个目标 ， 比如说 c 点 txt，其实也是可以的 ， 对不对 ？

但只是说就增加了一个麻烦嘛 ，但其实我觉得这个还不是最坑爹的 。 就我算我我我个人觉得就说你你可以允许空格 ，但是最好是就是不鼓励使用空格嘛 。

虽然说像 Mac 的这个操 ， 目前的这个 Mac 操作界面啊 ， 大量的使用了这个空格的这么一个系统 ，因为一旦涉及到空格 ， 你那个文件名就必须要用引号 ， 引号的话就有时候会导致比如说自动补齐的一些问题啊 ， 还有就包括有一些这种有些这个兼容性的问题 ， 比如说我们经常用这个 XARX， 就是有有一个命令 ， 它可以说你把这个前面的一的那个程序的输入全

部作为这个命令的参数来执行 ， 这么一个辅助的一个命令 ， 这个它是怎么判断前面你输入哪些参数给它 ， 它就说有个空格分隔开的 ， 那些都是各种各样的参数 ， 对吧 ？

如果你的文件名刚好又是个空格 ， 你怎么办呢 ？ 就就得你说那我就改一个来分割符来分隔这个参数嘛 ， 就不要用空格分隔参数了 ， 那我用一个什么 ， 比如说是这个就是 0， 就是 ASCII 嘛 ，是 0 的那个字符 ， 那个 null 那个字符来分隔这个前面的参数也也可以 ， 对不对 ？

但是就是这个东西就很就就很不自然了嘛 ，但我觉得其实就用空格的最麻烦的问题到前面那个都是说只是麻烦嘛 ， 还不是说不至于说呃完全呃不能用 ， 用空格作为在文件名里面最最坑爹的事情是你到底连续用了几个空格 。

**吴涛** [1:05:25]
啊哈哈哈 ， 就是 a 空格 b 点 txt， 这这是一个文件哈 ，a 空格空格 b 点 txt， 这是另外一个文件 ， 对不对 ？

**Eric** [1:05:34]
就是在一个非等宽的字体的显示环境之下， 非常严重的问题 。

**吴涛** [1:05:39]
对啊 ， 就你我们知道 ， 就是说在非等宽的情况下， 那个 a 和 b 它可能不是一个宽度 ， 我说 a 和 b 可能还看不太出来 ， 比如说 a 和小写字母的这个 ， 哎 ， 它可能就是在非等宽的情况 ， 它肯定是不一样宽的嘛 。

这个时候你说它中间到底间隔了几个几个空格 ， 你去数吗 ？ 难道或者如果说如果你说一一两个的区别可能还比较明显 ， 对吧 ？

五个和六个的区别你能看得出来 。

**Eric** [1:05:59]
但这个其实你用下划线或者用 hyphen 其实面临的问题是一样的 。 我觉得关键的问题还是在于空格 ， 它作为一个特殊的字符 ， 它其实是有别的作用 ， 它有别的意义的 。

对 ， 一旦你要把它容纳到文件名里 ， 你可能要引入别的机制来保护它 ， 比如你要加引号 。

**吴涛** [1:06:20]
就 escape 嘛 ， 转义嘛 。

**Eric** [1:06:22]
那这样子的话 ， 就是我文件名还能不能用引号呢 ？ 对 ， 所以就是你必须要引入别的机制 。 对 ，escape 机制在 Windows 上面是非常非常蛋疼的 ， 就是 Windows 自从支持这个文件名没有空格之后，Windows 最知名的一个带空格的文件名 ， 大家想想是什么 ？Program 空格 files， 真的发疯 ， 真的每次要进入这个路径真的是它就这么说吧 ，Unix 能有空格 ，但是 Unix 支持用 backslash 做 escape， 对吧 ？

你打文件打你打文件名打到一半 ， 你发现有个空格 ， 那你 backslash 空格就好了 。Windows 呢 ， 你要回到一开始的这个参数的最开始 ， 给它加一个双引号 ，而 Windows 的这个 Tab 呃 Tab auto completion， 它虽然会帮你加上双引号 ，但是它非常的蠢 ， 就是你在用的时候你会觉得啊 ， 蠢死了 。

**吴涛** [1:07:16]
而且而且 Windows 它也没有像那个 ， 就是它呃就是那个叫做 line editor， 就是那个命令行那一行的编辑器的时候 ， 它是我记得我它有它有那功能吗 ？

就是跳一个一个 word， 一个 word 跳 。

**Eric** [1:07:29]
Alt 加 f 是吧 ？ 没有 ，alt 加 f 也没有 ， 没有 w 全都没有 。

**吴涛** [1:07:33]
就比如说你想了一个写了个巨长的什么 CC 冒号斜杠斜杠 ， 然后 program 呃这个的时候 ， 你发现哎 ， 我要回 ， 你想要回到你想要回到行首 ， 只能按 home， 你不能按 Ctrl 加 a 之类的 。

那你就回来从第一个慢慢慢慢用这个箭头再挪到那个对应的那个位置 ， 加引号 c 前面 ， 对吧 ？

**Eric** [1:07:51]
对 ， 你看那些一直缠 ， 就德国有些很老的程序员一直缠 ， 然后修改文件名的时候要按按按那个后退键 ， 按按上那么二三十次 ， 你看他的时候你就真的会替他着急啊 ，oh my god。

**吴涛** [1:08:05]
所以给人一种德国人做事严谨的感觉 ， 对不对 ？

**Eric** [1:08:09]
模样工啊 ， 我给你们听一下啊

， 就这种感觉 。

**吴涛** [1:08:15]
哈哈哈哈 ， 请问键盘什么牌子 ？

**Eric** [1:08:18]
对对 ， 所以就刚才那个 backslash 其实又有 ， 就是那个叫做呃 backslash 叫什么 ？ 我我我一直搞不清楚哪个是斜杠 ， 哪个是反斜杠 。

**吴涛** [1:08:25]
反斜杠 ，backslash 是反斜杠 。

**Eric** [1:08:28]
等一下， 斜杠是从哪 ？ 从右上到东南 ，OK， 呃右上到左下， 这个是斜杠 ， 对吧 ？

**吴涛** [1:08:35]
对 ， 斜杠青年是斜杠青年， 反斜杠青年， 反向青年是用 backslash 做斜杠青年的斜杠青年 。

**Eric** [1:08:44]
哎呦 ， 哈哈哈 ， 斜杠这个右上到左下的是正斜杠 ， 左上到右下的是反斜杠 。

**吴涛** [1:08:52]
我怎么说的 ， 我们这个问题有点抬杠 。

**Eric** [1:08:55]
这实际上是一个怎么说右撇子的世界的偏见 ，因为右撇子在砍人的时候会自然而然的从右上举起来 ， 然后朝左下削下去 ， 对吧 ？

**吴涛** [1:09:05]
为什么一定要砍人呢 ？

**Eric** [1:09:07]
就 slash 嘛 ，slash 这个动作不是劈砍的意思吗 ？slash 是手 ， 就是你把你把你的手举起来 ， 你的惯用手举起来肯定是朝右上举的呀 。

**吴涛** [1:09:16]
对 ， 然后呢 ？

**Eric** [1:09:17]
然后劈劈下来是朝左下劈的吧 ？

**吴涛** [1:09:21]
啊 ， 就是啊 ， 我这么说吧 ， 就是在网址里面那个斜杠是正斜杠 ， 对吧 ？

**Eric** [1:09:25]
正斜杠 ， 对 ， 然后 Windows 的那个路径是反斜杠吧 ？

**吴涛** [1:09:29]
对 ，Windows 路径是反斜杠 。

**Eric** [1:09:31]
这是这实际上这实际上也是一个很有意思的叫什么路径依赖问题 ，因为 Unix 最开始是用反用斜杠作为那个路径分割符的 ，而 DOS 一开始是 DOS 1.0 是没有路径这个概念的 ， 所以也是后来加的 。

**吴涛** [1:09:47]
对 ，他们就是继承了当时 CPR CPM 的那个斜杠作为嗯 flag 的这个命名参数吗 ？

**Eric** [1:09:56]
作为参数的用法 ， 然后等到他们需要加入这个路径的时候 ， 那就用了反斜杠 。

**吴涛** [1:10:03]
因为斜杠已经被用掉了 ， 对吧 ？ 对 ， 这就造成了另外一个问题 ， 就是你用这个我们讲用 backslash 这个叫 quoting 嘛 ， 就是以保护那个空格的时候 ， 你会发现哎 ， 好像没法保护 ， 对吧 ？

因为我的那个斜杠有别的用途 ， 对 ， 太坑爹了 。 但现在的主流的操作系统哈 ， 就是还是就是最新的 ， 比如像 Windows 10 和这个 Mac OS 都是允许使用空格 ，而且是允许使用任意多个空格嘛 ， 就是连续也可以 ， 对 ， 对吧 ？

所以就会出现我刚才说的那个问题 ， 就是那就你非要搞事的话哈 ， 你要起个文件名 ， 对吧 ？a 啊 ， 然后隐藏后缀 ， 对吧 ？

然后又又起个文件文件名 a 空格 ， 又隐藏后缀 ， 对吧 ？ 然后又起个文件名 a 空格空格 ， 又隐藏后缀 ， 你发现哎 ， 这个文件夹怎么全都是文件 ， 都叫 a， 对不对 ？

**Eric** [1:10:46]
全全全是空格文件 ， 哈哈哈 。

**吴涛** [1:10:48]
不对 ， 就还有个空白的文件更猛 ， 对吧 ？ 这个也很有意思 。 但所以我觉得就是允许空格是可以的 ，但是我觉得就是能不写空格的时候还尽量不写空格 ， 避免太多那种坑了 。

**Eric** [1:11:01]
嗯 ， 所以文件名啊 ， 就是允许空格还好啊 ，但是你在编程的时候那些标标志符 ， 标识符 ， 标识符 ， 我们实际上是标志啊 ，identifier 标识符 ， 标识符的话就肯定不能有空格嘛 ， 对吧 ？

### 命名风格

**Eric** [1:11:16]
嗯 ， 那就就要变会变成两两个标识 ， 两个符号了嘛 ，identifier 嘛 。

**吴涛** [1:11:21]
对 ， 这这那那里个相对好理解嘛 ， 就是说那里至少有个明确的语义 ， 跟写字是一样的嘛 ， 你知道这是你写的是两个 word， 它不是一个 word， 就那肯定要用一个东西来分隔 ， 空格分隔天经地义嘛 ， 就在西文里面啊 ，是这样子 。

**Eric** [1:11:34]
嗯 ， 所以呢 ，在在编程的时候就开始各种类啊 ， 这各种函数啊 ， 就开始大家要连起来嘛 。 嗯 ， 就于是就有各种各样的这个写法了 。

**吴涛** [1:11:47]
对 。

**Eric** [1:11:47]
现在最流行的应该就是那种 Camel case 吧 ， 对吧 ？

**吴涛** [1:11:51]
呃 ，Camel case 和下划线 。

**Eric** [1:11:54]
取决于你干嘛吧 ， 现在什么 Kebab case，Camel case 和那个 Snake case 各有用处的 。

**吴涛** [1:12:01]
来来来 ， 跟大家解释一下这这是什么意思嘛 ， 对吧 ？ 先要讲这个场景是什么 ， 对不对 ？ 就就是说为为什么有这个需求 ， 就是说你因为因为不能用空格去分隔这个 ， 就是编程里面的一个一个一个一个词 ， 一个标识符 ， 对吧 ？

你不能用空格分隔 ， 至少应该我觉得目前主流的编程语言都是不支持这个点的 ， 你甚至你你也不能用引号 ， 对吧 ？

不能加引号 ， 引号是一个特殊符号 ， 你也不能用 ， 对吧 ？ 所以你要去说那我要分隔 ， 比如说 hello world 这两个写在一起的时候怎么办 ？

那通常的一种做法就是说我把这两个字就是连起来连起来一起写 ，但是 hello 这个 h 是大写 ， 然后这个 w 的这个 w 的 w 也大写 ， 对吧 ？

这个叫做叫做什么来的 ？Camel case，Camel case， 驼峰石 。 等等啊 ，Camel case，Camel case 和第一个是小写的 ， 对 ， 第一个一定要小写才叫 Camel case， 第一个大写的话叫 Pascal case。

但这个区别其实好像大家讲的那么多啊 ， 就是大家一般还是讲就说是就是首字母大写 ， 我们都是这样 ， 对吧 ？

**Eric** [1:12:59]
对 ， 比如说构建里面那个大写小写是有语义的 ，number function 实际上是 Camel，是实际上是 Pascal case，但是很多人会说那是 Camel case。

**吴涛** [1:13:07]
Camel case 就说你看你怎么去理解这个 ， 它的那个定义是啥 ， 就是说你只是说就大写 ， 就是叫做就有有这个词的这个首字母大写 ， 这种这一类你都叫 Camel case， 它也说得过去 。

那只是说因为在 Go 里面呢 ， 它的第一个字母是大写和小写 ， 会影响到它这个这个这个标识符的这个叫做 visibility 的可见性嘛 ， 所以这里面它就说那我我就不好去单独去给它起一个名字 ， 所以就只能就说这一类都叫都叫 Camel case 了 。

**Eric** [1:13:34]
呃 ， 好吧 ， 那你可以说 Pascal case 实际上是 Camel case 的一个一个一个特例 ， 对吧 ？

**吴涛** [1:13:40]
嗯 ， 就小驼峰和大驼峰 ， 如果小所谓的小驼峰就是呃首字母是小写 ，但是中后面的那个词呢 ， 那个第二个单词的那个是字母是大写 ， 就小驼峰 。

**Eric** [1:13:51]
对对对 ， 然后大驼峰的话就是连首字母也大写 ， 那这样的话也可以叫做那个 Pascal 嘛 ， 就 Pascal。

**吴涛** [1:14:00]
它是从 Pascal 源来的应该是 。

**Eric** [1:14:02]
对 ，但这里就有一个更坑爹的事情了 ， 就是说啊 ， 我考你们一个哈 ， 就其实有很多人有分歧的啊 ， 缩略词全大写的时候应该怎么办 ，是吗 ？

**吴涛** [1:14:11]
对 ， 怎么办 ？ 比如说我就是 UI 我想基本上那个都大家都基本上都是 ， 如果是在词所标的很多都是小写 ， 或者是这个那那也是一个要要值得讨论的问题 ， 这个还不是最最坑的 ， 最坑是这种 ， 比如说是 IP 地址 ，IP address 我写成一个字的时候怎么怎么大小写 ？

**Eric** [1:14:29]
IP 两个字必须两个字母必须大写吧 ， 通常来讲的话 。

**吴涛** [1:14:33]
那不就变成 Pascal case 了吗 ？

**Eric** [1:14:35]
哈哈哈 ，不是 ， 这里就很坑的在在这个问题在这里啊 ， 就是说呃 ， 先我们先不考虑 Go 语言这种比较特殊 ， 它对那个首字母大小写有这个语义的区别之外， 就说假设是完全没有语义区别情况下， 它其实也有也有讲究的 ， 就是说比如说是 i 大写 ，p 小写 ，a 大写的 IP address， 还是说 IPA 都大写 ， 然后 address 的后面那个出手字母的都小写 ， 这是一种写法

， 对吧 ？ 还有就是 IP 都小写 ， 然后 a 大写 ， 然后 address 的小写 ， 这种情况下， 对吧 ？ 就是你发现没 ， 它有很多这种不太明确的地方 ， 然后这种你说这个 IP address 还比较简单 ， 对吧 ？

但如果是刚好是这种时候缩略词吧 ，IP 是个缩略词嘛 ， 它是呃 Internet 呃 Protocol 的这个缩略嘛 ， 如果说我要写 IP URL address 怎么办 ？

**吴涛** [1:15:28]
那这好像这个就跟你的环境跟那个语言有关系 ， 然后有些它还是有习惯的 ， 比如说呃这个叫首字母缩写 ， 如果超过是三个或三个以上的话 ， 那么把后面几个字母小写 ， 就有那样的语言 。

**Eric** [1:15:48]
是啊 ， 就所以我就说这个事情呢 ， 就是其实是一个相对来说呃 ， 首先中文里面不存在这个问题 ， 对吧 ？

因为只有西文有大小写这个概念嘛 。

**吴涛** [1:15:56]
啊 ， 对啊 ， 然后在在在西文在大小写里面 ， 这种就会经常导致各种这种所谓的叫做呃圣战 ， 对吧 ？

各种坚持一定要某一种写法才对 ， 好 ， 另外一种某种写法才才更合理的 ， 这种争论是一直都存在 ，而且我估计在在我们死后它应该还是会继续存在的 。其实它怎么怎么大小写还是由这个 API 的设计者他当时拍脑袋想的吧 ，因为我们这边有 Web 开发者 ， 那个 XML HTTP request 里面就是 XML 全大写 ，但 HTTP 又不是全大写 。

**Eric** [1:16:32]
是吧 ， 很奇怪 ， 对不对 ？

**吴涛** [1:16:35]
就所以这个这个完全是看那个开发者当时他拍脑袋 ，他觉得这样写比较优雅 ，他就这么写 。

**Eric** [1:16:41]
看心情 。

**吴涛** [1:16:43]
嗯 ， 没有 ， 今天我们讲的是命名规则嘛 ， 像这种东西啊 ， 很多很多时候就是有规则 ，有的地方是没规则 ， 然后一个语言里面它有时候定了一个规则 ， 它自己都不统一 ， 经常会有这种事情 。

**Eric** [1:16:56]
对 ， 每个公司它有自己的这个 convention， 毕竟它是一个 convention 嘛 ， 就是它还是一种约定 ， 它它没有一种很强制的机制去约束它 ， 比如说如果有一个什么机器检测的机制禁止它做某件事情啊 ， 那它可能这个规则才会非常的强力的 ， 然后 comply 不过 ，是吧 ？

**吴涛** [1:17:15]
哈哈哈 ， 对 ， 就是这 ，但从从实用主义角度来讲 ， 你你你问这个 ，因为你用 Camel case 要解决什么问题 ，是解决不能用空格分词 ，也没也就说也让我们后面会用讲用下划线也是一个办法 ， 就如果在不能用空格也不用下划线的 ，因为我认为下划线是一个空格的变种嘛 ， 对吧 ？OK， 那不能用空格也不能用下划线的情况下， 你要用这个大小写来来展示词与

词之间的区别嘛 ， 那很显然这种情况下你就不应该把那种全大写的词呃全都真的全大写 ， 这样的话你看不清楚哪个它的那个边界在哪里嘛 ， 就好像刚刚你说那个 XM HTTP request 的情况下， 对吧 ？

那 XML HTTP 这是一个东西还是两个东西 ， 对吧 ？ 原教义的那种那种 Camel case 还是比较比较适合阅读的 ， 虽然说看看起来比较丑 ， 对吧 ？

为什么 XML 是这么这么一种写法 ， 就好奇怪哦 ， 感觉怪怪的 ，但从读的角度来讲 ， 或者从分词的这个角度来看 ， 对吧 ？

你还是要去找到它那个东西的本质是什么嘛 ， 它本质不是为了好看 ， 它本质是为了 clarity， 为了为了清晰嘛 ， 对吧 ？

**Eric** [1:18:17]
对 。

**吴涛** [1:18:17]
OK， 那就是这是一种命名方式啊 ， 第二种命名方式就像讲空格是肯定不行的 ， 那为什么我说下划线是空格的一个变种呢 ？

因为下划线它其实就是空格 ， 那里那个位置变成了一一一一条线 ， 然后下划线其实有一个区别是比较要要紧的 ， 就是在啊用鼠标双击选词的时候 ， 下划线它不会把那个词断开 ， 对 ， 这个其实挺蛮有用的 ， 比如说啊什么意思呢 ？

就是说嗯 ， 你想象 hello world， 如果你是空格断开 ， 它肯定你你点击 ， 我们默认是双击是选一个词嘛 ， 对吧 ？

一个 word， 那应该是会选到 hello， 然后它选不到这个后面那个 word， 那如果说你用下划线把 hello world 连起来之后呢 ， 你用你在大多数的这个图形界面 ， 你用双击的方式去选这个词 ， 它会把整个 hello 下划线 word 都都都圈起来 ， 都都选都高亮选选择起来 ， 对不对 ？

嗯 ， 就这个其实还是蛮有用的 。

**Eric** [1:19:08]
嗯哼 ， 这交互设计为了优化这种这种字符串才这么做的 。

**吴涛** [1:19:14]
对 ， 就它避免了那个就是大小写的那个争端 ， 对吧 ？ 这个时候你怎么用大小写就全看你的这个心情了 ，因为它跟语义和这个分词都它不都不影响了嘛 ， 对吧 ？

你都可以比如说刚刚那个是 HT 呃 XML 下划线 HTTP 下划线 request， 你都可以这么写 ， 对不对 ？ 其实不影响这个了 ， 那剩下就是好看的问题了 。

**Eric** [1:19:32]
不过理论上讲 ， 就是话用下划线的话就没那么碍眼 ， 说实话就就既有这个空格的这个空间感 ， 然后呢也没那么碍眼 ， 然后因为它是在下划线嘛 ， 所以它这个名字叫 Snake case 嘛 ， 就像是蛇 ， 哈哈 ， 跌在地上爬 ， 蛇对不对 ？

超形象的 ， 我觉得这几个名字都超形象的 ， 像这个下划线叫 Snake 吧 ， 呃连字符叫 Kebab， 对吧 ？ 烤肉烤串 ， 啊不是烤串 case 啥意思 ， 对吧 ？

就像一个串串在上面好多这个什么肉叉烧一样的感觉 ， 这一看就是是这个吃过去的 。

**吴涛** [1:20:11]
呃 ， 哎 ， 这个东西有中文翻译吗 ？ 就肉肉夹馍 ， 对不对 ？ 就就就就是肉夹馍 ， 肉夹馍 。

**Eric** [1:20:16]
字面意义上 Kibbeh 是旋转烧烤的意思 ，Döner 是 Döner 是旋转 ，Kebab 是烧烤 ， 然后呃连在一起叫连在 Kebab 是实际上是 Döner Kebab 的的简称嘛 ， 就是土耳其烤肉的简称 。

**吴涛** [1:20:34]
但是就是在 Kebab 这个词在进入这个英语语系里面之后， 它其实就是我们理解的那个串 。

**Eric** [1:20:40]
对 。

**吴涛** [1:20:41]
烤啊 ，不是串 ，Döner 是旋转 ，Kebab 是烤 ，Kebab 是烤的意思 。

**Eric** [1:20:47]
嗯 ， 对 。

**吴涛** [1:20:48]
对 ，但是就是我就说你你在那个就是英语里面 ， 它就是意思说对它这个东西语义变成了 Shashlik， 对 ， 就是变成一个串在一起的东西 ， 串 ， 对 ， 像像像竹签串起来这样一个东西 。

**Eric** [1:21:02]
对 ， 就是有一个罐在中间很细 ， 然后上面有一堆这个更宽的一个物件 ， 这个就是英文里面的这个 Kebab， 目前它它展示的这个也是这个 Kebab case 的这个意思嘛 。

**吴涛** [1:21:12]
对 。

**Eric** [1:21:14]
这个叫烤串 ， 烤串 case， 串这个字其实还是蛮形象的 。

**吴涛** [1:21:19]
这要是日本人来起的话 ， 就会变成那个的鸟串烧 ， 串鸟烧 ， 鸟串烧 。

**Eric** [1:21:25]
对 ，但但 Kebab case 有一个问题 ， 就是它并不是所有的这个啊语言都支持 ，因为因为因为横线就是不是用下划线 ，是用那个连字符或者叫减号嘛 ， 对吧 ？

它其实是有别的含义的 ， 可能是 a 减 b 的 ，也就是 Kebab， 然后杠这个 case， 它可能是一个你它认为你在执行一个这个就数学的这个减的一个操作 ， 所以这个其实在很多语言里其实是不支持这种方式的 。

**吴涛** [1:21:47]
Kebab case 最常见的就是在 CSS 里面嘛 。

**Eric** [1:21:50]
很啰嗦 。

**吴涛** [1:21:51]
就这也是因为 CSS 其实不进行计算的一个原因导致的 ， 对不对 ？ 它没有这个 compute， 除非用那个 calc 那个 。

**Eric** [1:21:57]
它是要空格 。

**吴涛** [1:21:58]
CSS 现在不是支持 calc 吗 ？calc， 所以你 calc 在 calc 里面你要想想写减号的话 ， 减号前后一定要有空格 。

**Eric** [1:22:05]
对 ，而且这空格不能不能被压缩掉 。

**吴涛** [1:22:07]
对 。

**Eric** [1:22:08]
不像有些空格可以压缩 。

**吴涛** [1:22:10]
就是那个叫什么叫语义敏感的空格 。

**Eric** [1:22:13]
对 ， 这个这个其实也挺不和谐 。

**吴涛** [1:22:17]
哈哈哈 ， 这是你看就是它其实这种历史背景的原因的 ， 过去没有运算 ， 那所以我用这个下划线用减用这个叫啥 ， 这不叫减号 ， 叫这个横线 ，其实没有什么啊区别 ， 对吧 ？

但后来发现哎 ， 我们现在要运算了哦 ， 怎么办 ？

**Eric** [1:22:33]
对 ， 这其实一切都是都是以路径依赖的功能 ， 假如当初键盘设计的时候能明确区分连字符和减号 ， 现在可能也就不会没有这个问题了 ， 所以 。

**吴涛** [1:22:43]
我觉得也区分不了吧 ， 这个很难啊 ， 就好像对于人来说 ，在我们人类在非常自然的情况下 ，是不会去考虑一个符号的语义跟这个符号的表现是可以分开的这个问题 。

**Eric** [1:22:54]
就我们看到这个不精确的物种 ， 它就看到一个短横 ， 一定会根据上下文来判断它到底是个减号还是一个 hyphen 的 ， 对吧 ？

但是计算机没有这个功能 。

**吴涛** [1:23:03]
那其实这个是阿拉伯人的问题 ， 对不对 ？ 为什么要用短横来表示减 ？

**Eric** [1:23:07]
哈哈哈 。

**吴涛** [1:23:08]
你用一个更加特殊的符号来表示减不就更好吗 ？

**Eric** [1:23:12]
这是阿拉伯人发明的吗 ？

**吴涛** [1:23:13]
是吧 ？

**Eric** [1:23:14]
哈哈哈 。

**吴涛** [1:23:14]
喂 ， 那我们现在这个加减乘除这个四个符号是用什么时候开始确定这个标准的 ？

**Eric** [1:23:18]
就乘号至少是非常不同意的 ， 历史上乘号有很多很多种表示方法 。

**吴涛** [1:23:23]
乘号我们只会在那个地方 ， 就只会在乘法里面用吧 ， 日常的这个这个叫什么日常排版里面并不会用 。

**Eric** [1:23:31]
我只是抛出一个想法 ，因为中国古代也不是用减号的 ， 对吧 ？ 中国古代减号是啥 ？

**吴涛** [1:23:38]
呃 。

**Eric** [1:23:38]
所有人都卡了 ， 对自己国家的文化这么不了解 ， 看你看看你们 。

**吴涛** [1:23:43]
九张算术 ， 对不对 ？

**Eric** [1:23:45]
哈哈哈 。 现在阿拉伯人其实不用阿拉伯数字 ， 阿拉伯数字实际上是是西方对印度数字一套一套的称呼 ， 所以我怀疑阿拉伯人其实也不是用减号的 ， 所以你不能把锅栽到阿拉伯人头上， 阿拉伯兄弟们已经背了太多锅了 。

**吴涛** [1:23:59]
那好的 ， 那就是 whoever 发明这套东西的时候 ，他就没就没想过这个 。 不然你你其实你这么想 ， 加减乘除那四个符号里面 ， 除了加和乘 ，其他两个都是有歧义的问题的 。

那除啊 ， 除如果你是用那个除还还好 ， 就如果这斜杠除也是有这个问题的 ， 那其实还是减号的问题比较多嘛 ， 对吧 ？

**Eric** [1:24:17]
反过来说 ， 现在英语键盘上就是我有时候觉得挺不可思议的 ， 打字机键盘上居然没有乘号这个这个这个符号 ， 就当初发明打字机的人会认为 X 和你用你用 X 来替代乘号就好了喽 ， 这是真的路径依赖导致了很多很多问题 。

**吴涛** [1:24:32]
那你要说这个键盘的话 ， 当年的键盘连那个小写字母 O 和数字 0 都可以用一个键位 。

**Eric** [1:24:39]
对 ， 那个可以理解嘛 ，因为造个那个造打字机那个机械结构那么复杂 ， 能少一个还是能省不少这个复杂性的 。

**吴涛** [1:24:45]
在机械打字机的时候 ， 乘号跟 X 的话那不一样 。

**Eric** [1:24:48]
赋予这个字符一个固定的语义 ，其实我觉得是很很计算机时代的一个事情 ，因为很晚进的 ，有有你可能思路思维的是这些事情 ， 人是人是一个通过语境和上下文来判断符号意义的动物 ， 它不是它不是要背下来这个符号 ， 或者说它根本就不可能知道一个符号在抽象的一种数据结构里面是一个什么东西 ， 它只是看到它 ， 它才知道它的这个神经网络 ， 对

吧 ？

**吴涛** [1:25:15]
好了 ， 我们不不讲这个东西了 ， 我们一会接着回来讲我们那个空格的事情 。 另外常见的一个命名 ， 就是我们各种这个网站的这个这个 URL 的 URL 里面是不能有空格的 ， 我想想 ， 对 ，URL 里面空格会被编码掉 ， 被转义掉 ， 就变成是多少啊 ？

### 网络命名

**Eric** [1:25:33]
20% 嘛 。

**吴涛** [1:25:34]
20%， 对吧 ？ 然后就是呃我们常见的这个所谓用户名 ， 对吧 ？ 这个其实我们或者比如你 Twitter 的这个我们叫 handle， 对吧 ？

啊 ， 邮件的这个邮箱的那个这个就是那个 @ 符号前面那部分也是不能有空格的 ， 通常是这样子 。

为什么呢 ？ 因为就刚刚说那个问题嘛 ， 你什么什么什么时候才能确定它是不是一个完整的词 ， 对吧 ？

跟刚才那个 identifier 其实是一样的 ， 这两个其实它本质上就是一个 identifier， 对不对 ？ 标识符嘛 。 那么很显然也也是不能有空格的 ， 那就是你得想是说那就可以用下划线 ， 就基本上下划线都是可以用的 ， 对吧 ？

但只是说那个就是横线或者是减号 ， 或者你叫连字符也好 ， 这个能不能用其实就取决于各个系统了 。

**Eric** [1:26:19]
哎 ， 这个断词总是一个很纠结的事情 ，因为西方他们必须要用空格断词 ， 然后遇到不能用空格的时候啊 ，他们就老纠结了 。

**吴涛** [1:26:28]
对 ， 想办法沟通解决方案吧 。

**Eric** [1:26:31]
你看现在那个 Twitter 的那个那个用那个 hashtag 嘛 ， 那个标签啊 ， 那个也是好烦的 ， 现在他们他们那个 API 有时候认那个标签的话 ，也是得得手工加空格才才会才会认当这一个那个标签嘛 。

**吴涛** [1:26:51]
因为它不然你不知道你你断到哪个地方 ， 它不知道呀 。

**Eric** [1:26:54]
对啊 ， 它像有一些优化吧 ， 就如果你输入一些很明显是标点符号的 ， 或者是特殊符号的字符 ， 它会给你断开啊 ， 至少我知道汉汉语的那些标点它都会给你断开 ， 好像 。

**吴涛** [1:27:06]
哦 ， 你说到这个 ， 我想起来 Twitter 的那个 hashtag 好像不支持 hyphen， 就是你的 tag 里面不能有 hyphen。

**Eric** [1:27:13]
嗯 ， 没有 ， 它跟那个呀 ， 它跟用户名是一样的 ，Twitter 用户名也不能有 hyphen 啊 ，也只能用下划线 。 哦 ， 所以你你它它本质上你说你你你回到刚才那个问题嘛 ， 就是说这个这个 hashtag， 这个 tag 本身是个什么东西 ， 它就是一个 identifier， 如果说它是个 identifier， 你想到在编程里面你什么时候你你是不是绝大多数地方都不能用这个减号 ， 对不对 ？

那其实也是一个道理嘛 。

**吴涛** [1:27:36]
嗯 ， 嗯 ， 倒是中文语境下面这个问题就比较比较奇怪了 ， 你说微博它是用两个 ， 它其实把那个那这个这个井号键当成引号来用 ， 对不对 ？

就是两个圈起来的才是 。

**Eric** [1:27:50]
因为中文不分词嘛 ， 你你不加个后面的话 ， 你不知道这个串串到什么到什么地方结束嘛 。

**吴涛** [1:27:56]
但问题就来了呀 ， 就是那我是井号啊 ， 标签井号标签井号 ， 这个时候算啥 ？

**Eric** [1:28:03]
你说你说配对问题是吗 ？

**吴涛** [1:28:04]
对 ， 配对问题嘛 ， 就是有这个问题了嘛 ， 就是就是另外一个 。

**Eric** [1:28:07]
还有嵌套问题是吧 ？

**吴涛** [1:28:09]
对对对对对 ，因为引号其实也是一个非常坑爹的事情啊 ， 正常说我们引号是有这个开引号关引号的区别的嘛 。

**Eric** [1:28:17]
对 。

**吴涛** [1:28:17]
但是对吧 ， 我为了打字机 ， 我们为了省那个那个键位 ， 我们又合二为一 ， 只搞一个了 ， 对不对 ？

**Eric** [1:28:25]
对啊 ， 所以我们这个做字体排印的就深恶痛绝的 ， 千万不要用傻瓜引号 ， 结果都是打字机惹的祸 。

**吴涛** [1:28:32]
对啊 ， 就是为了也不叫他打字机惹的祸吧 ， 就是为了省钱导致的 ， 都是没钱 。 所以所以微博那个那个双井号符号 ， 它就是你把它想成引号的用法来用就行了 ， 或者想成是啊 ， 书名号都不算 ， 书名号是两个是不一样的嘛 ， 就引号的这种方式来用就可以了嘛 。

所以其实我觉得以后要发明什么新的方式的这种 quoting 的方式的时候 ， 一定要配对啊 ， 就是不要用这个引号来来引了 ， 你就用用这个书名号好了 ， 对吧 ？

或者用那个叫方括号来引号 ， 对 ， 括弧 ， 对吧 ？

**Eric** [1:29:05]
各种括弧 。

**吴涛** [1:29:05]
因为基本上括弧都是肯定是有方有这个有这个开关两个的嘛 。

**Eric** [1:29:09]
嗯 ， 然后还得让它自动配对 ， 然后还允许嵌套是吧 ？ 大括弧小括弧中括弧 。

**吴涛** [1:29:17]
对对对 ， 这样发现就在你在写 list， 哎 。

**Eric** [1:29:21]
所以就不用去数那个缩进或者怎么样是吧 ？

**吴涛** [1:29:25]
对啊 ， 就完完全藐藐视缩进啊 ， 缩进本来就很烦人了呀 ， 就是说你你凭什么 ， 你凭什么判断这一行前面有 10 个空格 ， 凭什么要求我写程序还要带着一把油压卡尺 。

**Eric** [1:29:37]
哈哈哈

， 这是一个 Python 梗 ， 哈哈 ， 回头我们把这个链接放在学文档里面 ， 吓死我了 。

**吴涛** [1:29:48]
不过啊 ， 现在 CamelCase 啊 ， 就把这个词越练越长了 ， 现在特别是那个什么 ObjectC， 咱们那种啰啰嗦嗦的语言 ， 哇 ， 它这个名字超长的那个 API 的名字 。

**Eric** [1:30:00]
那简直了 。

### API之长

**吴涛** [1:30:01]
就我之前是不知道啊 ， 就是我比如说我们现在很多你用的这个 iOS 的手机 APP， 很多现在好像是开始变少 ， 就以前都是这个时候的 ObjectC 这个语言写的 ， 然后但现在有有有 Swift 这个语言写可能会好一些 。ObjectC 那个语言的命名规则真是太奇怪了 ， 它就要把一个 API 的那个全部写全 ， 一个 API 的一个一个叫什么 ， 一个参数 ， 就是啊 ， 五个单词写全 。

**Eric** [1:30:26]
对 ， 它的 method signature 就是叫什么方法签名 ，是非常长的 。

**吴涛** [1:30:31]
就你认为它就是一个函数名吧 ， 你可以这么理解 ， 对吧 ？

**Eric** [1:30:34]
对 。

**吴涛** [1:30:34]
嗯 ， 这函数名都是要写全 ， 我们通常都是比如按我们过去 C 的那个 ， 都是都写非常简短 ， 对吧 ？

**Eric** [1:30:41]
C 它是可以把单词缩写嘛 。 这一切都要归功于 small talk， 就 small talk 就有这一套嘛 ， 就是一个参数有两个名字 ， 一个是外调用者看到的名字 ， 另外一个是参数内部看到的名字 ， 这个其实我觉得是非常合理的 ， 就哪怕现在 Swift 你看它还是继承了这一套 ， 就这个东西还是蛮有用的 。

而且怎么说呢 ， 我觉得 Mac 就是 ObjectC 和和 Java 一样 ， 就是是一个重度依赖于 IDE 的语言 ， 你你没有自动补全的话 ， 你拿来写这个真的是非常自找苦吃的一件事情 。

但是如果你有自动自动补全的话 ， 那文件名多长就无所谓了 。

**吴涛** [1:31:17]
它想的是说你可以直接读到这个这个参数或者这个这个函数名的时候 ， 你就从它这个名字就能一眼看出来这个函数是干啥 ， 它会把这个把这个东西的功能定义得非常清晰嘛 ， 对吧 ？

但不像我们之前在可能上古时代啊 ，Unix 那个时候写这个 C 都写得非常短的文件名 ， 呃 ， 这个函数名 ， 比如说什么从这个 terminal 去个字母 ， 它是什么 get ch 的 ， 它连那个 character 的 ， 你说我们正常写那个 character， 你说 character 这个是几个单字母的词 ， 就比较长吧 ， 你只要写个 car 吧 ， 就 CHAR， 对吧 ？

它连那个 CHAR 都不要 ， 它直接 get ch， 对吧 ？ 你自己猜 ch 后面是个啥 ， 对吧 ？

**Eric** [1:31:53]
对 ， 这实际上也是一个 ， 这实际上还是一个路径依赖的问题 ， 就是你想大型机在 60 年代那个时代 ， 你你每次连上主机去写程序的时候 ， 你会希望自己的按的键能需要按的键越少越好 ，因为就像现在我有时候所有人都 work from home， 对吧 ？

你有时候连公司的那个虚拟机还是会觉得慢 ， 你打一个键 ， 我们好像有一期节目聊过这个问题 ， 就是你按一个键之后多久之内获不到延得不到延迟 ， 你个人就会非常焦躁 ， 你会觉得整个思路被打断了 。

那我现在就经常会遇到这种状况 ， 那我现在就希望说我靠 。

**吴涛** [1:32:29]
赶紧使用 Mosh 啊 ，Mosh。

**Eric** [1:32:32]
对啊 ，有道理 ，但是我要连公司的虚拟机 ， 这个过程是没有办法用 Mosh 来实现的 。 对 ， 我要先连到公司的 virtual machine 上， 然后再从 virtual machine 上 Mosh 到到公司内部的远程界面 ， 那那这个过程呢 ， 就没有什么延迟了 ， 对吧 ？

所以就是 60 年，60 年代的时候 ， 人们写程序当然会希望说需要输入的字符越少越好 。

**吴涛** [1:32:51]
而且是那些很常用的底层的功能 ， 它可能会被反复调用嘛 ， 然后它刚才你说那个 small talk， 它有内外那个区别的这个机制 ，但其实在 C 里面应该是之前是没有的 ， 对吧 ？

**Eric** [1:33:02]
对 。

**吴涛** [1:33:02]
它就是你要会反复调用 ， 如果你的文件那个那个函数名太长的话 ，其实会浪反复浪费掉很多这个字节去存储这个调用的这个这个 entry point 在哪里 。

**Eric** [1:33:13]
对 ，而到了 ObjectC 或者是 Java 的时代 ， 那基本上所有的人都在本地客户端 ， 都是都是 。

**吴涛** [1:33:20]
不会省那一个字节的 。

**Eric** [1:33:21]
后后客户端 ， 你的响应都是在本地的 ， 所以你就不会说需要有把名字弄短这个需求 ， 对吧 ？ 除了只有只有奇葩的 PHP 是是个 。

**吴涛** [1:33:34]
现在最好的语言 ， 你说什么 ？

**Eric** [1:33:36]
只有奇葩的 PHP 是用这个函数名的长度作为一个 hash。

**吴涛** [1:33:43]
你的想象法 。

**Eric** [1:33:44]
这是一个让人匪夷所思的决定啊 ， 所以 PHP 的函数名有长有短 ，是故意有长有短的 ，不是故意啊 。

**吴涛** [1:33:53]
但是但是就是说回来就是 ，但是 ObjectC 的那个那个函数名真的是就是过于长了 ， 就是即便是在现在的目光的这个观点来看 ， 还是过于长 。

**Eric** [1:34:03]
我觉得对于写 Java 的人来说 ， 真的不算什么呀 ， 就 。

**吴涛** [1:34:06]
很啰嗦呀 。

**Eric** [1:34:07]
对啊 ，Java 里面也有很啰嗦的传说名啊 ，不要太多 。

**吴涛** [1:34:11]
至少 Java 的那些有一些这个参数 ， 你每个参数都要写参数名吗 ？ 不用吧 ？

**Eric** [1:34:16]
不用 ， 那倒不用 。

**吴涛** [1:34:17]
那 ObjectC 要写的呀 ， 对吧 ？

**Eric** [1:34:19]
ObjectC 它那个每个 method， 它还会把那个用那个冒号就连起来嘛 ， 就是它后面带了一个参数 。

**吴涛** [1:34:26]
对啊 ， 就是 。

**Eric** [1:34:27]
然后就可以串的超长超长的 。 那个是函数签名的一部分 ， 这个这个是可以理解的 ， 就就就好像就好像 C 语言的函数签名 ，其实也要把函数的类型带上的 ， 只不过不像 ObjectC 写的非常的显示了 ， 就是你必须显示的告诉对方 ， 我要调用这个方法里面这个参数叫这个名字 。

但是在有些函数里面 ， 你比如说 Java 的函数签名实际上也是包含类型的 ， 就是你必须写出类型来 ，而 ObjectC 是不用写出类型来的 ，但是它要写出那个别名来 。

**吴涛** [1:34:57]
OK， 那那至少我们可以讨论另外一件事情 ， 就是假设你还是就是我们都认可 ， 还是要把这个写得尽可能清晰为准 ，但有个限度 ， 这个限度在哪里的问题嘛 ， 比如说这个我们这个 show notes 今天给的这个例子啊 ， 这个是一个苹果的一个 API， 呃 ，是 AppKit 的什么 NSATS typesetter 里面有一个 ， 我要我要念一下这个函这个函数的 。

**Eric** [1:35:20]
先深吸一口气 。

**吴涛** [1:35:21]
你们你你请深吸一口气 ， 我先深吸一口气 ， 你们请听听好了哈 。 Should break line by hyphenate before character at index.

**Eric** [1:35:31]
Hyphenating， 你要加 ing。

**吴涛** [1:35:34]
对 ，hyphenating。 对 ， 我我先测量一下这个这个一共一共有 。

**Eric** [1:35:39]
掏出你的作为一个 Python 程序员 ， 掏出你的油压卡尺来 。

**吴涛** [1:35:43]
50 个字 。

**Eric** [1:35:43]
OK， 假设当然肯定 ，但是吴涛也说了嘛 ， 这个因为都是图形界面不存在这个问题 。 假设你在这个纯字符界面 ， 你是一个 80*25 行宽的这么一个这么一个编辑器的窗口里面 ， 这 50 个字就已经干掉一整行了 ， 对吧 ？

你还不用干别的 。

**吴涛** [1:36:00]
对 ， 这还不是 Coco 最长的 API。

**Eric** [1:36:03]
Show notes 里面大家看那个 API 名最长选首全的吗 ？ 你们打开那一页看看 。

**吴涛** [1:36:07]
对 ， 你看你会发现你打开那个看到的话 ， 你会发现最长是 javawindows.net。

**Eric** [1:36:12]
对 ， 还是还是还是 .net 比较 。

**吴涛** [1:36:14]
没有 ， 最关键是什么呢 ？ 像 Coco 啊 ， 像 ObjectC 它啰嗦就啰嗦也就算了 ，但是因为它啰嗦 ， 它是因为它不缩写词 ， 然后呢 ， 它都还很有语义 ， 所以读起来呢还算是 OK 的 。

你不像那个 .net， 它即使写那么长了 ， 它看不懂它什么意思 。

**Eric** [1:36:33]
还带缩写 。

**吴涛** [1:36:34]
它带了缩写还看不懂什么 ，而且还很啰嗦 。 你看那个就比如说这个例子 ， 那个 103 个字母 ， 那个那什么鬼那个 。

**Eric** [1:36:42]
我觉得 Coco 还有 Coco 的 API 还有一点很有意思 ， 就是或者说导致了间接导致了它名字比较长的一一点 ， 就是它会用什么 should did 来表示 before 和 after， 就在别的 API 里面 ， 比如说什么呃窗窗口 load 这件事 ， 别的 API 会叫做 before windows load 或者是 after windows load， 然后在 Coco 这里呢叫做 windows should be loaded 或者是 windows did load， 这个还蛮有意思的 ， 算是 Coco 啊一套 ， 就哪怕现在 Swift 也是这样的 。

**吴涛** [1:37:19]
但我我有时候在想 ， 这个是不是跟另外当时他们诞生那个背景有一个思潮有关系 ， 就是你们还记得那个叫呃 AppleScript 那个语言吗 ？

**Eric** [1:37:29]
嗯 。

**吴涛** [1:37:30]
就它是它的那个语言 ， 就是你完全 。

**Eric** [1:37:32]
自然语言进化是吧 ？

**吴涛** [1:37:33]
就像自然语言嘛 。

**Eric** [1:37:35]
嗯 ， 对 ， 所谓自然语言描述这个东西 ， 那么它就会什么描述呢 ？ 就说就全部都是用这个 ， 我们现在都是用什么符号来表达一些特殊的语义的地方 ， 它都尽可能用这个啊英文来来表述 ， 甚至连这个比如说定义参数啊 ， 定义函数这些都是用这种方式来做 ， 它其实可能跟那个时候的那种思潮有一定的关系 。

**吴涛** [1:37:53]
但是你说 should 和 did 会比 before 和 after 更贴近人的使用习惯吗 ？ 我觉得不见得吧 。

**Eric** [1:38:00]
不不 ，before after 跟 should 这肯定是语义上是不一样的嘛 ， 这个是个判断 ， 对不对 ？ 它说 should 就说你会得到一个是还是不是 ，但你 before after 它就它得到的一个结果不是一个 boolean 嘛 。

**吴涛** [1:38:11]
就是要就得出一个布尔值 ， 对吧 ？

**Eric** [1:38:14]
嗯 ， 对 ， 它得到它其实是做一个逻辑判断 ， 就是说你这个时候是得到一个是是还是否 ， 对吧 ？ 但如果你是 before break line 的 ， 你得到这个什么东西你是看不出来的 。

**吴涛** [1:38:22]
问题是我说的这个 API 是一个 ， 比如说它是呃在写你在写 GUI 的时候 ， 你要写一个函数 ， 这个函数应该在窗口被绘制之前调用 。

**Eric** [1:38:32]
OK。

**吴涛** [1:38:33]
这个函数名在 OS10 里面叫做 。

**Eric** [1:38:36]
那就叫 before 嘛 。

**吴涛** [1:38:36]
Should present， 比如说 。

**Eric** [1:38:39]
哦 。

**吴涛** [1:38:40]
但是在别的编程语言里面 ， 它可能就叫 before drawing 之类的 。

**Eric** [1:38:43]
嗯嗯嗯 ， 那可能就是语义的问题了吧 ， 就是你怎么去定义这个东西 ， 就是总体来讲 ， 它还是想维持一个就是所谓的这个真正意义上的可读性 ， 可读什么意思 ， 就是你用嘴去念那个东西 ， 它还是得到了一些这个一些概念的 。

**吴涛** [1:38:58]
对 。

**Eric** [1:38:59]
嗯 ， 这个东西就是说不一定是适合 ， 比如说假设你是一个非英语母语的人， 比如说中国 ， 中国很多程序员就这样 ， 为什么老说这个中国程序员做的这个这个 API 比较比较奇怪 ， 对吧 ？

因为它 。

**吴涛** [1:39:11]
晦涩难懂 。

**Eric** [1:39:12]
对 ， 它难懂 ， 它根本它它脑子里面不是用那套英文那个逻辑来思考的嘛 ， 所以它你怎么可能要求它得出一套这个 should break line by hyphenating before character at the index 这种语句出来呢 ？

它肯定不会这么做 ， 对不对 ？

**吴涛** [1:39:26]
所以我们只好写文言文了 。

**Eric** [1:39:28]
不不不 ， 中国程序员最大的特点不是用拼音缩写吗 ？ 包括包括很多政府网站都是政府网站缩写为 JFWJ， 我靠 ，oh my god。

**吴涛** [1:39:40]
那这也是对 ， 这也是一个很很有意思的一个一个事情 ， 就是说如果它不用拼音缩写 ， 它还能用啥 ？ 你说我先把那个翻译成英文 。

**Eric** [1:39:50]
对 ， 这这好吧 ， 我承认刚才我有点英语本位主义了 。

**吴涛** [1:39:55]
不就是不 ，也不是说英语本位主义 ，其实我觉得在那个就是纯这个技术范围层面里面去 ，其实是应该英语本位主义的 ，因为你的那个所有的那个底层的那些逻辑都是英文的方式来命名的 ， 对不对 ？

这个毫无疑义嘛 ， 没有问题 。

**Eric** [1:40:09]
不 ， 你要真真到底层的话是二进制啊 ， 就我觉得 。

**吴涛** [1:40:12]
不是不是 ， 我就说在在那个你还比如说你还是会讲这个 console 啊 ， 你会讲 device 啊 ， 你会讲这个什么 socket 啊 ， 这些这些概念这些还是逃不掉的吧 。

**Eric** [1:40:22]
嗯 。

**吴涛** [1:40:22]
就是现在的那些操操作系统软件系统的那些构建单元啊 ， 它还是以这个英文来命名为主的 ， 就像我说那个东西嘛 ， 虽然说确实有是你是有这个句柄 ， 对吧 ？

你有套接字 ， 对吧 ？ 但是你不会真的去写这几个字啊 ， 你还是写的是 handle HDL 嘛 ， 或者是这个 socket 的 。

**Eric** [1:40:40]
句柄 ，window window handle， 这是一个 Windows Windows 编程的 。

**吴涛** [1:40:44]
对 ，但我就说这这种底层的概念是英文的 ， 那么你基于它构建的东西 ， 你就肯定还是以这个英文来描述它 ， 你猜这条逻这个才才自洽嘛 ， 才通顺嘛 ， 对吧 ？

这个是没有 ， 这个我觉得是毫无疑问的 。 问题是出在刚才你说那个就不能泛化 ， 比如说你说那个 UR 里面它是说这个啊 ， 我们随便想一个政府网站啊 ， 这叫今日公告 ， 对吧 ？

它肯定是今 JR 呃 G 呃 GG， 对吧 ？ 那你你说那肯定是这么写的 ， 那它上说 today's news， 它不会就对吧 ？ 它没有一个底层 ， 没有一个 foundation 去给你构建这个东西啊 ， 所以就那个不成立嘛 。

所以所以我觉得这两个情况我觉得还是不一样 ， 就是说如果你能够讨论的那个最小的那个单位啊 ， 或者就说就是常用的单位 ， 它是一个什么样的语言描述的 ， 你可能其上构建东西还是要以这个为主嘛 ， 就好像哪怕你用文言文言编程的时候 ， 那除非你把底层的那个什么就是句柄和这个套接字都都用文言来描述 ，不然你就很尴尬

嘛 。

**Eric** [1:41:42]
知乎上不是有一个答案说说如果就是问题是什么 ， 如果计算机是中国人发明的 ， 那么底层会是什么样的 ？

其实它就把那把周易的那一套话术套套进去了 ， 阴阳这样 。

**吴涛** [1:41:56]
对对对对对 ， 所以所以我觉得就是说你要去评价这个做法合不合理的时候 ， 你都是不能单点来看 ， 你肯定是要成体系的来看 。

那现在的这个情况就是说计算机的所有的底层的这个体系都是以英语英语为方为这个主体来构建的 ， 那你没有办法喽 ， 你就只能呵呵跟着这样写喽 。

**Eric** [1:42:17]
嗯 ，不知道有没有什么大神可以做一个兼容 Unix 的完全自从最底层开始就由中文构建的操作系统 。

**吴涛** [1:42:27]
青柠 。

**Eric** [1:42:29]
青柠 。

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

**Eric** [1:42:30]
不行 ， 我我说出这个的时候就已经输了 ， 对不对 ？ 为什么会这么写呢 ？ 哈哈哈 ， 一定要用中文来描述这个东西 。

**吴涛** [1:42:36]
哈哈哈

， 没有必要 。 我觉得我觉得那个趋势是融合 ， 就是就融合出一种杂糅的杂糅的一个 。

**Eric** [1:42:47]
对 ， 你看那个什么什么跟这种比较好的科幻片里面 ， 未来都是中中西文夹合 。

**吴涛** [1:42:53]
克里奥利语 。

**Eric** [1:42:54]
就是网上现在所谓的这种什么 00 后用的那种网络缩写语 ， 它不就是用那种英语的单词和这汉语拼音的缩写给它混在一起 ， 然后再用一个首字母缩写 ， 就这种这种例子非常的多 。

**吴涛** [1:43:08]
什么 NMSL 这种的 。

**Eric** [1:43:11]
对 ， 就这种这种当然是完全的这个是汉语拼音的首字母 ， 还有一些就是借用了英语的 ，因为现在有些英语单词 。

**吴涛** [1:43:18]
哦 ， 就像那个泰国网友 ， 泰国网友反击的时候说呃 NMSL needs， 你妈死了 needs， 这就是一个很典型的哈哈哈克里奥尔克克里奥尔语的例子 。

**Eric** [1:43:31]
哈哈哈 。

### 字符禁忌

**吴涛** [1:43:36]
哎 ， 我我们聊聊那个这个特殊字符啊 ， 刚才讲了一个空格 ， 这个特殊字符其实可能是比较常见 ，其实还有很多其他的特殊字符不能在呃很多地方使用的 ， 对吧 ？

**Eric** [1:43:47]
主要是 Windows 的那个限限制很多呀 ， 像 Mac 都没有啊 。

**吴涛** [1:43:51]
哦 ， 你在 Windows 里面命名一个非法文件的时候 ， 它会跳出来一个对话框 ， 里面苦口婆心的告诉你哪些文件是哪些符号是不能用的 。

**Eric** [1:44:01]
一大堆 。

**吴涛** [1:44:02]
这个还蛮那个贴心的呀 ， 我觉得这个我觉得很好啊 ， 就是像 Mac 那种过于自由 ， 我觉得是有问题的 ， 就是最好建议你不要这样干那种 ， 那就说你就直接禁止你这么干不更好 。

但是 Mac 现在也也会跳出一个对话框 ，其实呃 Mac 也是有禁止字符的 ，Mac 其实是不能用那个冒号 ， 唯一一个不能用的就是在文件名里面是不不让用冒号的 。

如果你要改冒号的时候 ， 它会跳出一个对话框 ， 然后提醒你 。 但是它说的它说那句话就是比就比 Windows 说的就很温柔啊 ， 它说请尝试使用字符较少或不含标点符号的名称 。

**Eric** [1:44:39]
那圆点算不算标点符号 ， 对吧 ？ 这就很奇怪了 ， 对不对 ？

**吴涛** [1:44:42]
因为其实是可以用的嘛 ， 对 ，因为你在 Mac 上其实都可以 。

**Eric** [1:44:45]
对 ， 对 ， 就是就是其实要要想一下， 就是为什么就即便可以用啊 ， 我觉得还是不建议使用这些特殊字符作为文件名 ，其实有很多比较实际的问题 ， 比如说这里我们这个 show notes 里面列了几个哈 ， 就是这个大于号小于号 ， 对吧 ？

因为这个在呃就是类 Unix 的系统下面 ， 它就有这个管道重定向的 ， 它都有其其他的特殊特殊意义嘛 ， 你这样用了之后， 那别人要调用或者是要指向你这个文件的时候 ， 就必须用这个 quoting 或打引号的方法嘛 ， 就其实会增加比较多的呃麻烦 ， 对吧 ？

包括这个这个 bar 这个 pipe 这个字符其实也是 。

**吴涛** [1:45:18]
可以用监控号吗 ？Unix 里面可以用监控号做文件名吗 ？

**Eric** [1:45:23]
可以啊 。

**吴涛** [1:45:24]
你就引起来嘛 。

**Eric** [1:45:25]
OK。

**吴涛** [1:45:26]
就现在现在都是这样子 ， 就是你要往一边写 ， 理论理论上都是可行的 ， 它唯一阻挡你的地方无非就是在那个资源管理器的时候弄一个你 ，但是你自己非要写个程序去生成这么一个文件名 ， 然后再把它放到文磁盘上面去 ， 这个是可都是可行的 ，因为文件系统本身它没有这个限制 ，不让你存这个东西嘛 。

**Eric** [1:45:46]
OK。

**吴涛** [1:45:46]
对它来说还就是一个数字而已 。

**Eric** [1:45:47]
啊 ， 我就说从对 ， 从实用主义的这个观点来讲 ， 就是尽量去避免这些容易出问题的字符会比较好 。

那所以其实就回到了最开始的那个命名规则了 ， 就是说啊 ， 如何命名你的这个文件会导致减少问题 ， 就是不要用标点符号其实是最好的 ， 任何标任何标点符号 ， 包括空格是最好的 。

啊 ， 那个下划线不算 。

**吴涛** [1:46:10]
要抬杠啊 ， 空格是标点符号吗 ？

**Eric** [1:46:13]
对 ， 这个标点其实是指的是英语英语世界里的标点 。

**吴涛** [1:46:17]
对对对 ， 中文的话就完全不存在这个问题嘛 ， 你比如说什么你要用中文的书名号 ， 你根本就就就计算机就不认为它是个特殊符号 ， 对吧 ？

就没没什么区别 。

**Eric** [1:46:27]
对 ， 主要还是因为英语的这个标点符号 ， 就日常书写中的标点符号 ，也被这个程序代码借用来表达了很多特殊的意义 。

**吴涛** [1:46:36]
对 ，是的是的是的是的 。

**Eric** [1:46:38]
我记得当初刚学编程的时候 ，有些有就有些同学会很疑惑 ， 为什么英文的就是它输入法只装了中文输入法 ， 然后再用中文 ， 为什么用中文的标点符号就看起来跟英文的一模一样 ，但是在程序就跑不起来呢 ？

这是一个非常疑惑的问题 ， 会困扰初学者的问题 。

**吴涛** [1:46:56]
特别是在那个只有 10 个像素乘以 10 个像素宽的时候 ， 到底这个中文引号 ， 那中文这个这个括号和硬括有啥区别 ， 看不太出来 ， 就很坑 。

所以就是又变成之前 U 呃 Unicode 那个玄学的问题了 ， 两个看起来一样的符号 ， 它应该是一个一个码位啊 。

**Eric** [1:47:14]
嗯 ， 嗨 。

**吴涛** [1:47:15]
是不是一个深坑啊 ？

**Eric** [1:47:16]
是 。

**吴涛** [1:47:17]
哎呀 ，不过我每次看到这个反斜杠 ， 就想到日文西日文 Windows 的那个日元符号 。 哎 。

**Eric** [1:47:23]
啊 ， 那个是因为什么 ？ 因为是因为它刚好是把那个那个位把位给占了 ， 所以 。

**吴涛** [1:47:27]
对 ， 就是 ASCII 里面借用了一下 。

**Eric** [1:47:29]
哎 ， 为什么会借用到这个呢 ？

**吴涛** [1:47:31]
就他们那时候一一拍脑袋啊 ， 就觉得好像说这个反斜杠不用 ， 然后呢 ， 日文日本人要用那个要用日元符号嘛 ， 所以呢 ， 就在这个码位上面放上了这个日元符号嘛 。

**Eric** [1:47:45]
这个日元符号是在那个 ASCII 的那个头 128 个里面的嘛 。

**吴涛** [1:47:49]
对 。

**Eric** [1:47:50]
哦 ， 我知道了 。

**吴涛** [1:47:51]
就是占了反斜杠的位置 。 嗯 ， 所以当年的话 ， 就是日文的那个系统 ， 它就打不出反斜杠的 ， 就只能打日元符号 。

**Eric** [1:47:59]
这叫什么来着 ？ 呃 ， 这个以日本为代表的东亚文化 ， 试图对欧美这个主导的这个什么什么的一个一个一个突突破 ， 对吧 ？

逆袭 ， 唯一成功的一次 。 因为因为其实你看在基本上所有的编码里面 ， 那个 ASCII 都是作为一个神圣不可动摇的一个基础的嘛 。

**吴涛** [1:48:18]
对啊 ，而且我觉得他们脑子很奇怪 ， 如果要换的话 ，也也应该把就是把美元符号换成日元符号嘛 ， 对吧 ？

那么为什么要就 。

**Eric** [1:48:27]
那不行啊 ， 那那那到时候美美国爸爸就不开心了 。

**吴涛** [1:48:30]
这还是不可能的吧 ？ 我觉得把日元符号换成美元符号 ， 比换掉后 backslash 更不可取啊 。 那个时候美元是多重要的一个东西 ， 现在也很重要吧 。

**Eric** [1:48:40]
所以他们当时肯定是觉得说这个反斜杠很不重 ， 没嗯 ，不重要嘛 ， 所以呢 ， 就把这个挪掉了 。 结果谁知道呢 ，Windows 把这个反斜杠来做路径了 ， 结果日文的 Windows 的是是蛮蛮眼都是日元符号 ， 都是钱 。

**吴涛** [1:48:55]
对 。

**Eric** [1:48:56]
啊 ， 对对 ， 等一下等一下， 刚才说忘记说了一个 ， 就是在 Mac 里面的唯一一个不让用的是冒号嘛 ， 对吧 ？

其实这个冒号啊 ， 呃 ，是我们这平时用的在 GUI， 就是在图形界面上不让用冒号的 。 嗯 ，因为是他们那个路径其实用的是冒号 ， 对吧 ？

所以是它这个路径的保留字 ，其实就是老方方言的里面 。

**吴涛** [1:49:19]
等一下， 我试一下 。 命令行内是可以用冒号的啊 。

**Eric** [1:49:23]
在命令行是可以用冒号的 ， 对吧 ？ 然后在图形界面是可以用斜杠的 ，但是同样一个文件名在命令行里面 ， 这个斜杠会变成冒号 。

**吴涛** [1:49:35]
哎 ， 等一下， 我刚才建在命令行里面建了一个带冒号的文件 ， 然后在图形界面看它变成了一个斜杠 。

**Eric** [1:49:43]
对 。

**吴涛** [1:49:45]
啊 ， 就就交替了 。

**Eric** [1:49:47]
对 ，是是反着的 。 嗯 。

**吴涛** [1:49:49]
哎 ， 为什么是会这样呢 ？

**Eric** [1:49:51]
因为冒号在 GUI 里面有别的作用嘛 。

**吴涛** [1:49:54]
我靠 ， 太神奇了 。

**Eric** [1:49:56]
哦 ， 冒号在图形界面有什么用啊 ？

**吴涛** [1:49:58]
在图形界面里面是不让用冒号的文件名。

**Eric** [1:50:01]
那它那它为什么要显示成斜杠呢 ？

**吴涛** [1:50:04]
这这很难理解啊 。

**Eric** [1:50:06]
反正现在你现在 Mac 的处理方式就是图形界面和和这个命令行里面冒号和斜杠是反着的 。

**吴涛** [1:50:14]
互相替代 。

**Eric** [1:50:15]
因为在早期的 Finder 里面 ， 早期的 Finder 里面的这个路径是用冒号隔开的 。

**吴涛** [1:50:23]
哎 ， 真的哇 ， 真的会反 ， 真的会反过来 。 哎 ， 我第一次知道有这个事情 ， 就是我在 Finder 里面建一个 for。

**Eric** [1:50:31]
斜杠 bar 在 Terminal 里面显示为 Terminal 显示为负冒号 bar。

**吴涛** [1:50:36]
我我我不跟你说了吗 ？ 再说一遍 ， 就是在老的 Finder， 就是老的系统里面 ， 就是 Classic， 嗯 ，Classic 的这个 Mac 里面 Finder 的路径的分割符 。

**Eric** [1:50:48]
是用冒号 。

**吴涛** [1:50:49]
路径分割 Windows 是反斜杠嘛 ，在 Finder 里面是冒号 。

**Eric** [1:50:53]
哦 ， 嗨 ， 果然是一个用过 Classic Mac 的人。

**吴涛** [1:50:57]
哦 ， 我怪不得 ， 我就说 。

**Eric** [1:50:58]
所以这是老老 Mac 系统里面唯一一个的这个预留字 。

**吴涛** [1:51:04]
OK， 明白明白 。

**Eric** [1:51:07]
嗯 ， 所以是直到现在为止 ，Mac 也是只嗯不让用冒号 。 然后这个它会跟斜杠转义 。

**吴涛** [1:51:14]
OK，但现在其实已经没有再有这个 Classic Mac 了 ， 对吧 ？ 所以这个转义其实完全没有什么现实意义了 。

**Eric** [1:51:23]
这它就变成这个图形界面那个 Finder 的一个那个 spec 掉了 。

**吴涛** [1:51:27]
OK， 哼 ， 这个很有意思 。

**Eric** [1:51:30]
这让我想起了 Windows，Windows 上其实除了文件名不能用特殊字符之外， 还有不能用一些特殊保留字 ， 比如说你不能把一个文件名叫做 Com。

**吴涛** [1:51:40]
Com 是因为什么 ？ 是因为那个串口的英文 。

**Eric** [1:51:43]
Com 是 Com 是 Console 吧 ？ 然后还有什么 PRN 还是 PNT， 还有 Aux auxiliary， 对 ，也不行 。 对 ， 这这这个当时是为什么 ？ 我记得有这个事 ，但我忘了原原因是什么了 。

**吴涛** [1:51:56]
Com 是 Console， 就是你要是打 copy Com， 然后空格 target.txt， 你就可以输入从那个从那个 Console 上输入字符 ， 然后呃 ， 把它存成 target.txt， 就是 Com 实际上是 Console 的一个 。

**Eric** [1:52:11]
啊 ，有特殊意义的这个这个这个名字 ， 对吧 ？ 它不是不能存在这个文件名。

**吴涛** [1:52:16]
对 ， 相当于一个相当于相当于 Terminal 里面的保留字了 。

**Eric** [1:52:21]
啊 ， 对 ，但这个还蛮不 ， 我觉得这个还蛮不合理的啊 。

**吴涛** [1:52:26]
这个其实很很常用啊 ， 这个就它如要是为了解决这个问题 ， 直接禁掉了好几个就比较简短的名字嘛 。

那你如果这样 ， 如果这样 ， 你还不如直接用一个什么特殊符号引呃引起来 ， 或者或者你在前面加一个 ， 你在前面加一个 escape 也可以啊 ，不是下划线 Aux。

**Eric** [1:52:43]
都要比 Aux 好吧 。

**吴涛** [1:52:46]
或或者是就是你用你你反正已经有那么多特殊字符不能用了 ， 对吧 ？ 你就把用一个特殊字符来作为一个前缀了

， 或者用比如说美元符号这种情况 ， 对吧 ？ 因为基本上不会有人把文件命名为美元符号开头的文件名吧 ？

**Eric** [1:53:02]
You never know。

**吴涛** [1:53:03]
也难说 ，也难说 。

**Eric** [1:53:05]
所以啊 ， 那个时候假如我们来做系统的话 。

**吴涛** [1:53:09]
就是当时这种选择肯定有它不合理的那个这个傻逼的地方 ， 对吧 ？ 但是肯定有很多情况下是有有不得已而为之的办法 。

**Eric** [1:53:18]
就是说 legacy。

**吴涛** [1:53:20]
路径依赖真的可以解决很多解释很多问题 。

**Eric** [1:53:23]
对啊 ， 你看你说这个刚才讲为什么 Mac OS 现在里面你用一个反斜杠会变成在在图形界面 ， 字符界面会变成冒号 ， 对吧 ？

然后冒这个冒号这里会这里又反过来 ，不就是因为和这个 Classic Mac 要兼容嘛 。

**吴涛** [1:53:37]
嗯哼哼 。

**Eric** [1:53:39]
这个也是非常坑 。

**吴涛** [1:53:40]
而且因为我们原来我自己原来是最早学 DOS 的 ， 我是打死我也不会敢在一个文件名里用斜杠的 。

**Eric** [1:53:48]
说实话 。

**吴涛** [1:53:48]
哈哈哈 ， 会出问题 。

**Eric** [1:53:51]
多恐怖的一件事情啊 。 然后哈哈哈 ， 然后现在在 Mac 居然可以用斜杠 ， 就首先这是第一个意外， 然后我再用这个命令行再去看一下， 发现变成冒号了 ， 又变成第二个意外啊 ， 就疯掉了 。

**吴涛** [1:54:03]
所以它到底那个情况 ， 那到底它存的是冒号还存的是斜杠呢 ？ 就是在啊 ， 怎么描述这件事情 ， 应该也还是以字符界面的为准吧 ？

就只是说 Finder 它是个显示的问题 。

**Eric** [1:54:16]
等等啊 ，Unix 上面的文件名是存在哪的 ？ 是存在 INO 的上的吧 ？

**吴涛** [1:54:23]
啊 ， 应该是吧 ， 看那个文件系统的 。

**Eric** [1:54:26]
所以你要用一个 ， 所以你要在去文件系统里面看这个东西到底是底层是被存成了哪一个字符是吧 ？

**吴涛** [1:54:32]
对对对对 ， 我很好奇这件事情 ， 它到底存在那里存的是啥 。

**Eric** [1:54:36]
我我我押冒号 。

**吴涛** [1:54:39]
我我也赌应该是冒号 。

**Eric** [1:54:42]
我也觉得应该是冒号 。

**吴涛** [1:54:44]
对 ， 嗯 ， 斜杠只是给你们这些愚蠢的人类看一看而已 。

**Eric** [1:54:48]
斜杠 isillusion， 对吧 ？

**吴涛** [1:54:50]
对 ， 追寻它底层到底是什么字符 ， 这个这个问题就留给 Rio 当做他的课后作业了 。

**Eric** [1:54:57]
我去 ， 哈哈哈 。

**吴涛** [1:55:00]
好的 。 嗯 ， 哎 ， 所以所以你看 ， 就是如果这种情况发生哈 ， 就是你们想怎么办 ， 就是会发生什么事情 ， 这个也是一个小作业 。

啊 ，Mac Mac 上可以的文件名 ， 往 Windows 上比如说你拿个 U 盘复制过去 ， 对吧 ？ 或者是反过来 ， 啊 ，Windows 上可以有的文件名往 Mac 上复制会发生什么 ？

**Eric** [1:55:20]
它会把你改掉啊 。

**吴涛** [1:55:21]
还是会报错 ？

**Eric** [1:55:24]
它不会报错 ， 它会自动把你改掉 。

**吴涛** [1:55:27]
就是直接月租代跑了 ， 说你只能这么干 ， 对吧 ？

**Eric** [1:55:30]
改掉是什么意思 ？

**吴涛** [1:55:31]
它会还会替换掉 。 嗯 ， 我有个问题啊 ， 就比如说我现在有一个 U 盘 ， 然后我把 Mac 上一个包含了 Windows 非法字符的文件拷过去了 ， 然后我这 U 盘插到 Windows 上， 它在资源管理器看起来是什么样的 ？

**Eric** [1:55:46]
在非法的边缘试探 。

**吴涛** [1:55:48]
Boom， 直接炸了 。

**Eric** [1:55:49]
哈哈哈 ， 你自己试一下 。

**吴涛** [1:55:51]
哈哈哈

， 比如说我我要我要整一个一个你整一个 U 盘的这个 Aux，Com1，Com2，Com3，Com 的 LPT1 都放进去 ， 然后你怎么办 ？ 然后拿到 Windows 上去 ， 哎 ， 无法打开 ，不可以打开这个文件 。

**Eric** [1:56:07]
就不可以打开呢 ，是后来的吗 ？ 就我首先我我还能不能看到这文件呢 ？ 这文件是在直接在我的 U 盘上就是看不到了吗 ？

是怎么样的 ？

**吴涛** [1:56:17]
不知道 ， 我们可以做个实验试一下 。

**Eric** [1:56:19]
还是会被转义掉呢 ？ 还是 。

**吴涛** [1:56:22]
那那呃 ， 那个那个符号可以转义嘛 ，但是像那个 Windows 的那几个不能就不可不可能存在的文件名 ， 你肯定就比较尴尬了吧 。

**Eric** [1:56:31]
这让我想起了那个 VMRC， 如果你手工创建一个以点开头的文件的话 ，是是做不到的 ，但是你可以通过编辑器把它另存为这样一个文件 ，在 Windows 里面是可以的 。

**吴涛** [1:56:43]
啊 ， 嗯 ， 点开头的文件在 Unix 下面它是叫做啊 ， 隐藏文件的意思嘛 ， 就是隐藏的嘛 ，listing 是看不见的 。

**Eric** [1:56:50]
Mac 也是吗 ？

**吴涛** [1:56:50]
嗯 ， 对 ，Mac 是 Mac 上就 Mac OS 上它继承的这 Unix 那套逻辑 ， 它也是用了这个这个东西的嘛 。

**Eric** [1:56:56]
Unix 在早期的时候没有隐藏文件这个概念 ， 它只不过在比如说你在 iOS 或者是在什么的时候 ， 它默认会跳过那些点和点点 ，因为代表本级目录和上级目录 ， 所以有些人就发现那我直接把文件一点开头 ， 对 ， 它就不会列出来了 。

**吴涛** [1:57:14]
所以就是为了不写代码 ， 为了省事 ， 为了省事的一个 hack。

**Eric** [1:57:19]
对 。

**吴涛** [1:57:19]
嗯 ，其实也好了 ， 这种为了省事 ， 至少我觉得还有个什么客观的理由嘛 ， 对吧 ？Com1 怎么一回事 ， 就是这个 。

**Eric** [1:57:27]
哈哈哈 ， 真的很过分啊 ， 你知道吗 ？

**吴涛** [1:57:30]
始终不能挽回 。

**Eric** [1:57:31]
没有更好的选择 。

**吴涛** [1:57:32]
对 ， 啊 ， 还有这个 Com 从 123456789， 然后那个还有那个 LPT 的 123456789 都是不能 。

**Eric** [1:57:43]
LPT 是什么 ？ 是是打印机那个什么接口吗 ？ 还是什么玩意儿 ？

**吴涛** [1:57:46]
LPT 好像是打印机 。

**Eric** [1:57:49]
但反正我记得就当年那个真是打打印机有这个接口是这样子的 。

**吴涛** [1:57:53]
对 。

OK， 终于可以聊大小写的问题了 ， 又是一个深深的坑 。

**Eric** [1:58:01]
哈哈哈 。

**吴涛** [1:58:02]
等一下， 我先理一下现在是什么一个情况 ， 就是说啊 ， 我们我们我们都我们不考古了哈 ， 就只只聊现代这个文件系统 ， 现代这个操作系统 ，在 Mac 上面默认情况下是可以叫什么来的 ？

区分哦 ， 这里要先讲两个概念 ， 什么叫大小写敏感和大小写保留 ， 对吧 ？ 这两个概念是什么意思呢 ？

就是说假设我写这个呃 AB， 然后 A 大写 B 小写和写 AB 都小写的情况下， 它是应该是一个文件还是两个文件的问题 ？

如果说它两个是 ， 你认为它是两个是一个文件 ， 它说明这个系统是大小写不敏感 ， 对吧 ？ 因为它认为它是同等的一个东西嘛 。

这个时候 ， 比如说我们从从这个从这个实现的逻辑来讲 ， 你可以认为说那存的时候都是把啊这个东西转义成这个小写 ， 然后存在文件系统里面去 ， 或者是都是都是呃做成大写存在文件系统里面去 ， 这个不重要哈 。

**Eric** [1:58:55]
比如 DOS，DOS 就是 DOS 的标准操作好像全都是大写 。

**吴涛** [1:58:59]
大写 ， 对对对 ， 就是这个是明 ， 就是敏不敏感的问题啊 。 这个保不保留 ， 或者叫英文里面叫做 preserving 嘛 ， 就是 case preserving 的问题 ， 就是说啊 ， 虽然你可以不敏感 ，但是你也可以保留这个的区别 ， 就是什么意思 ？

它你还是知道 ， 嗯 ， 说这个 ， 虽然说 A 大 A 小 b 和小 a 小 b 都是都是你认为是等价的 ，但是你还是把这个大 a 小 b 给存下来了 ， 对吧 ？

**Eric** [1:59:23]
抄只是照抄而已 ，但是还是把它当的一样的 。

**吴涛** [1:59:27]
对 ， 所以这里面我就一直没想明白的一个事情 ， 就是说既然大小写都都这个叫什么呢 ， 都呃不敏感了 ， 对吧 ？

你你为什么还要保留呢 ？ 就其实没什么用啊 。

**Eric** [1:59:38]
我觉得是为了客户用户方面吧 ，因为用户有时候 。

**吴涛** [1:59:42]
就看起来对 。

**Eric** [1:59:43]
那这就是拉丁字母本位的表现了 ，因为使用拉丁字母的人 ，他们有大写和小写 ，但是他们在他们脑海中对这个大写和小写的区分的语义的识别能力会相对弱一点 ，他们会认为他们是一样的 。

**吴涛** [1:59:59]
意思上是一样的 ， 对 ， 形式上写的不一样 。

**Eric** [2:00:02]
嗯 ， 就是就是其实跟那个 Unicode 的那个问题是有点类似的 ， 对吧 ？

**吴涛** [2:00:06]
而且刚才也不说了各种那各各种什么 CamelCase 这种东西 ， 它其实它大小写只是为了容易读嘛 ， 对吧 ？

意思其实是一样的嘛 。 所以就是看起来好看而已 ， 然后还是当做一个东西 。

**Eric** [2:00:22]
但这些这里其实是在不同语义下面 ， 这个东西是有非常大的区别的 。 虽然说我们我们又回到刚才那个 CamelCase 那个地方 ， 那讲的是什么 ？

那讲的是 identify 嘛 ， 就是识别符 ， 对吧 ？ 在绝大多数语言里面 ， 这个识别符都是大小写敏感的 ， 就是刚才说这个大 a 小 b 和小 a 小 b， 它明显是它可以是两个 ， 它是两个不同的一个变量也好 ， 两个不同的一个名字 ， 对吧 ？

但是在绝大多数的这个名呃 identifier 作为作为 ID 的时候 ， 作为一个比如用户账户用户名的时候 ， 它通常是不敏感 。

比如说我们讲 Twitter 的这个 ，Twitter 就是这么一个典型的例子 ，Twitter 它是就是说是大小写保留 ，但是大大小写不敏感 ， 对吧 ？

比如说我的这个这个这个 Twitter 的 handle 叫做 real jot， 对吧 ？ 就是我这 R 和 J 大写嘛 ， 这是两个词嘛 。 但是你在 URL 里面 ， 你写这 6 个字母的任意大小写组合 ， 它都是带到我的那个页面上面去的 。

所以它这个这一点 ， 它其实 Twitter 的这个命名这一点 ， 它其实是跟这个 Mac 上默认的啊 ， 文件名命名的那个大小写的敏感方式是一样的 ， 叫做 case insensitive， 大小写不敏感 ，but case preserving， 对吧 ？

但保留大小写 。

**吴涛** [2:01:30]
哎 ， 现在的你们有人写 Visual Basic 吗 ？Visual Basic 应该是大小写不敏感的 ，但是 Visual Basic 是不是大小写保留的呢 ？

我记得不太清楚 ，因为当时 VB 当时被最被人吐槽的一个 ， 会被最被职业程序员吐槽的点 ， 就是它居然是一个大小写不敏感的语言 ， 你可以想象吗 ？

**Eric** [2:01:53]
哈哈哈 。

**吴涛** [2:01:54]
哎 ， 等一下，Daunet 它整个那个命名规则是一样的吗 ？

**Eric** [2:01:58]
不一样 ，Daunet 只是一个 runtime。

**吴涛** [2:02:01]
不一样 ，Daunet 好多语言 。

**Eric** [2:02:03]
Daunet 底层肯定是区分大小写的 ， 就是那套 IL。

**吴涛** [2:02:07]
Mac 上面其实是可能这个问题相对复杂的 ，因为 Mac 上它存在一个同一个文件系统 ， 它有另外一种方式是可以大小写敏感的 。

**Eric** [2:02:16]
日志是区分大小写 ， 对吧 ？

**吴涛** [2:02:19]
我那个时候就是傻不拉几的把自己的那个分区隔成了这个 ， 就严格区分大小写的文件系统 。 后来好多游戏装不了 ， 就是装游戏的时候 ， 它会说你不能把这个这个程序装在一个大小写敏感的分区上面 。

**Eric** [2:02:34]
嗯 ， 很扯 。

**吴涛** [2:02:35]
它因为它不一样 。

**Eric** [2:02:36]
对对对 ， 这是另外一个比较对 ，因为因为比如说 Mac 上我们现在用的主流的这个 ， 就是这个叫做呃呃固态存储嘛 ， 固态存储它现在默认的那个呃文件系统格式是 APFS 嘛 ，但是在 Mac 上面呢 ， 它是用的是 Mac 的这 APFS 的大小写不敏感的那它那个默认值 。

但是在 iPhone 上面 ， 虽然你看不见啊 ，但是在 iPhone 上面 ， 它默用的默认是 APFS 大小写敏感的那一套 。

**吴涛** [2:03:01]
哦 ，iPhone 是区分大小写的呀 。 啊 ， 就是 AP 呃 APFS 区分大小写的 。

**Eric** [2:03:06]
APFS 是大小写敏感的 ， 对 。

**吴涛** [2:03:10]
对对 ， 很奇怪对吧 ？ 所以我觉得其实这是一个问题 ，因为我是觉得就是从啊信息的这个角度来讲 ， 肯定说是区分是更好的 ， 只是说从从叫什么来的 ，idiot proof 这个角度来看 ， 可能稍微差一些 。

但是在 iOS 上面去 ， 用户是并不能直接读写文件系统的嘛 ， 所以不存在这个问题 。 那既然他们自己不是 idiot， 那就没有这个问题了呀 。

**Eric** [2:03:35]
好吧 。

**吴涛** [2:03:36]
哎 ， 等一下，Windows 现在什么状况 ？ 我有点忘了 ，Windows 是大小写敏感吗 ？ 不敏感 。

**Eric** [2:03:40]
Windows 现在是大小写保留 。

**吴涛** [2:03:42]
那就跟 Mac 一样嘞 。

**Eric** [2:03:43]
那就不敏感了 。

**吴涛** [2:03:45]
对 。

**Eric** [2:03:45]
嗯 。

**吴涛** [2:03:46]
OK， 然后那个 NTFS 是没有这个大小写敏感的选项的 ， 对吧 ？

**Eric** [2:03:50]
应该是没有的 。

**吴涛** [2:03:52]
就这个其实大小写呃叫什么来的 ， 大小写不敏感 ，但是大小写保留 ，其实在实现上其实有有会导带来一个更麻烦的事情的 ， 就是你要存 ， 比如说你你你想一下哈 ， 你要去判断这个文件到底在这个目录里面存不存在的时候 ， 你要做什么 ？

你要先把这个文件名找找到目标文件文件名 ， 你要先把它统一化成一个一个 ， 比如说都小写或都大写 ， 然后你还得把这个这叫什么来的 ， 就是这个目录里面已经有的文件名都得统一成多少多少多少 ， 你才能够逐个字符逐个这个字字符比较嘛 ， 对不对 ？

所以我觉得这个其实就是就其实效率挺低的 。

**Eric** [2:04:30]
对对 。

**吴涛** [2:04:31]
所以我觉得大小写敏感还是一个更好的一个一个方案吧 。

**Eric** [2:04:34]
嗯 。

### Unicode陷阱

**吴涛** [2:04:37]
然后就是另外一个更加坑爹的问题了 ， 就是那文件名可不可以用 Unicode 来写 ？

**Eric** [2:04:45]
用 emoji 来写是吧 ？

**吴涛** [2:04:47]
现在是可以的呀 。

**Eric** [2:04:48]
是是是可以的 。

**吴涛** [2:04:49]
现在是现在已经可以了 ， 就好像就好像那个 Swift 最开始不就是好多例好多例子里面都出现了用 Unicode 做的 identifier 吗 ？

就非常坑爹 。

**Eric** [2:05:01]
对 。

**吴涛** [2:05:02]
你想要来一个自动完成都做不到 。

**Eric** [2:05:04]
一个现代的语言嘛 ， 它基本上都是以这个 Unicode 友好为 ， 或者叫做 Unicode 兼容为为为 。

**吴涛** [2:05:11]
卖点 。

**Eric** [2:05:12]
一个标准嘛 ， 对 ， 为卖点 。 你可以就是它可能也是就是刚才我们考讨论的另外那个问题了 。 既然你都说不要以这个英语为中心主义的话 ， 那我的文件不 ， 我的这个变量命名为什么不可以是中文呢 ？

**吴涛** [2:05:27]
嗯 。

**Eric** [2:05:29]
那既然都可以是中文了 ， 为什么不能是一个的 emoji 呢 ？

**吴涛** [2:05:34]
哈哈哈 。

**Eric** [2:05:35]
所以所以它可以啊 。

**吴涛** [2:05:36]
你刚才发出了一个什么声音啊 ？

**Eric** [2:05:38]
就是就是一个某一种表情符号吧 。

**吴涛** [2:05:42]
哈哈哈 。

**Eric** [2:05:42]
啊 ， 那个呕吐的那个是吗 ？

**吴涛** [2:05:44]
哦 ， 你刚才你刚才你刚才同学们刚才 Rio 念出了呕吐这个表情符号 。

**Eric** [2:05:50]
哈哈哈 ， 为他赋予了语音 。

**吴涛** [2:05:54]
这毕竟是一个纯听觉的节目啊 ， 你要我怎么办 ？ 我只能采用同感的方式给你们展示 。

**Eric** [2:05:59]
我们感受到了 。

**吴涛** [2:06:00]
哈哈哈 ， 感受到了是吧 ？

**Eric** [2:06:04]
是 。

**吴涛** [2:06:04]
以后 Rio 应该出一套 ， 应该在节目里面出一套这个 emoji 的发音指南 。

**Eric** [2:06:10]
不叫做 ，不得叫做啊 ，podcast emojis user guide。

**吴涛** [2:06:15]
哈哈哈 ， 比如说笑出猪叫声这个 emoji。

**Eric** [2:06:18]
哈哈哈

，有这个 emoji 吗 ？ 没有这个 emoji。

**吴涛** [2:06:26]
哈哈哈 。

**Eric** [2:06:28]
就是我我这个就不叫 emoji 了 ， 这叫什么 ？ 这叫 voice emoji 对吧 ？Audio emoji。

**吴涛** [2:06:35]
这根本就不是 emoji。

**Eric** [2:06:38]
对 ，其实就是嗯 ， 就这里就是用 Unicode 作为这个命名的方式呢 ， 就是刚才会出现类似于最开始提到的那个 ， 哎 ， 这个中文的括号和英文的括号怎么长得都一样 ，但是为什么我始终找不到这个文件的这个问题 ， 对不对 ？

但 Unicode 也提供了那个 ， 我们之前也解释过啊 ，有那个叫什么 ， 叫叫什么 collide 的那个方案 ， 对不对 ？ 就是虽然这两个它不是同一个码位 ，但是我们在搜索或者是在处理的时候 ， 认为它们在语义上是等价的 。

所以理论上你只要找到这个东西 ，也能找到另外一个 ，但这个就是程序要做更加复杂的这个这个特别的 handle 嘛 ， 就不能只是简单的啊 ， 我只要比较这两个这个字符串 ， 它每一个字节是不是一样就可以了 ， 对吧 ？

就是就会变得更加复杂 。

**吴涛** [2:07:25]
嗯 ， 那个超复杂的 。 哎 。

**Eric** [2:07:27]
所以这个什么 ， 为什么我们不能有一个简单安全的呃应用的系统 ， 可能就是对吧 ， 这帮人干的 。

**吴涛** [2:07:34]
哈哈哈 。

**Eric** [2:07:36]
你们记不记得当年呃应该是哦 ， 好好有好几年前了 ， 就是 iPhone 的在某某最开始的几年的时候 ， 经常会出现 ，因为你收到一条短信 ， 里面包含了一个奇怪 Unicode 的组合 ， 然后你就系统 。

**吴涛** [2:07:49]
就崩溃了 ， 对 。

**Eric** [2:07:50]
系统就就死机或者崩溃了这种情况 ， 对吧 ？ 对 ， 你可以说这个是这个叫什么 ， 那个程序员写的这个这个这个代码 ， 这个软件质量不够高 。

没错 ， 事实上也是这样的 ， 对吧 ？ 但是这个复杂度是因为什么东西引起的呢 ？

**吴涛** [2:08:04]
所以现在那个 Unicode 他们在做很多事情的话 ， 很首先就是在安全性上面 ，是他们那个很大的一个考虑因素啊 。

**Eric** [2:08:14]
对 。

**吴涛** [2:08:15]
就这个在各家实现的时候要考虑 。

**Eric** [2:08:17]
因为他们进行这个信息交换的时候 ， 就就全部都传过去了嘛 。 哈哈哈 ， 一传过去的话 。

**吴涛** [2:08:23]
对对对 ， 就是本质上你从信息安全角度来讲 ， 这个是就是说你只要从从外部传过来的一一一段信息 ， 你就认为默认它应该是不可信的嘛 ， 对吧 ？

然后又又又恰巧碰碰上了这个 Unicode 这么一套复杂的要死的系统之后， 那就很容易出现问题嘛 ，因为复杂度越高 ，bug 越多嘛 。

**Eric** [2:08:42]
对 ， 所以一开始他们就有些朋友可能哈就觉得很奇怪嘛 ，Unicode 不就是一个文字的编码吗 ？ 怎么还会跟这个信息安全扯上关系 ？

**吴涛** [2:08:51]
怎么错了 ， 对吧 ？

**Eric** [2:08:52]
其实就是因为它里面有很复杂的这各种文字都夹在里面 ， 所以很容易很容易做文章 。

**吴涛** [2:08:58]
嗯 。

**Eric** [2:09:00]
你看他逼得我们吴涛都已经不再从事安全行业了 ， 都是这个用户需求的坑 。

**吴涛** [2:09:06]
我觉得主要还是怎么说呢 ， 安全行业需要人们有意识 ， 就是只有人们认为安全是重要的时候 ， 安全安全安全行业才有前途 。

### 尾声

**吴涛** [2:09:15]
现在只能说大部分人都太没有 ， 就太不在乎了 ， 只有等到失窃的时候才会才会后悔 ， 真的 。

**Eric** [2:09:23]
人们是 ， 那肯定 。

**吴涛** [2:09:25]
对 ，但我就说你的你的这个解决方案什么 ， 那就只能说就大大投入嘛 。 但我的想法就是说能不能能不能够可以不要加大成本 ， 就是不要给我搞那么 Unicode 麻烦事好吧 ？

为什么要组合啊 ？ 哈哈哈 ， 一个字一个码位代表一个字不好吗 ？ 你又不缺那几个码位 ， 对吧 ？ 组合个毛线啊 。

**Eric** [2:09:44]
对 ， 你知道有一种呃 ， 比如说 Lua，Lua 就是一个所谓 ASCII clean 的这么一个编程语言 ， 它的核心的整个 library 是不会触及到这个 ASCII 的第八位的 。

呃 。

**吴涛** [2:09:57]
就全部都一把 ， 就是七七位搞定 。

**Eric** [2:10:00]
所有的东西都在 ， 就是耳熟能详 ， 所有机计算机 ， 所有的 C 语言系统都支持的这些码位里面 。 这也是一个思路吧 ， 就是走这个绝对可行的最小的集合 。

**吴涛** [2:10:13]
但是不行啊 ， 用户需求提出来我就要看这个 。

**Eric** [2:10:16]
的 emoji 怎么办 ？

**吴涛** [2:10:18]
哈哈哈 。

**Eric** [2:10:22]
Rio 是本日最佳声优 。

**吴涛** [2:10:24]
哈哈哈 ， 对吧 ？ 所以哎 ， 这个就是说呢 ， 最终还是向这个用户需求妥协了 ， 对吧 ？ 还是必须得硬着头皮上， 就把这些 bug 都都给修了 ， 然后拿着那个超级厚那个 Unicode， 现在那个应该是出到 11 了 ， 对不对 ？

**Eric** [2:10:39]
对 。

**吴涛** [2:10:40]
13 了 。

**Eric** [2:10:41]
13 了 ， 我又 out 了 ， 就是那那个那个册子页多多有多少页了 ？ 现在它那个规范 。

**吴涛** [2:10:46]
哦 ， 你说的那个 PDF 啊 。

**Eric** [2:10:49]
给我问梁海了 。

**吴涛** [2:10:51]
对啊 ， 应该得上百兆了吧 ， 我估计 。

**Eric** [2:10:55]
Unicode 的第 11 版的 core specification 的 PDF 版本是 976 页 。

**吴涛** [2:11:03]
哈哈哈 ， 那 13 肯定超过 1,000 了 。

**Eric** [2:11:08]
嗯 ，但是一个这个 PDF 一共才 14.2M。

**吴涛** [2:11:14]
啊 ， 还好还好还好 。

**Eric** [2:11:15]
这还只是 core， 那还有周边的吗 ？

**吴涛** [2:11:18]
这只是 core specific， 就就不带那个码表 。

**Eric** [2:11:21]
对 ， 它附录还有那些数据表非常的多 。

**吴涛** [2:11:24]
对 ， 嗯 ， 这只是 core specification 而已 。

**Eric** [2:11:26]
一个一个一个超级无底的深坑 。

**吴涛** [2:11:30]
啊 ， 想想就是累啊 ， 对于我们这种就是尽可能说砍砍砍用户需求 ，不要增加复杂度的这种思维方式的人， 这个这个什么过于复杂可以不做 ， 对吧 ？

好吧 ， 今天我们这个脑洞也比较多哈 ， 然后这个聊聊了这个哇天呐 ， 从哪里聊到哪里了 。 不过挺好的呀 ， 就是就整个命名规则嘛 ， 对吧 ？

就是文呃像这个长度 ， 自然的字符串长度 ， 然后空格 ， 呃就这个保留字 ，不允许的字符 ，不允许的这些文件名是否区别大小写 ， 这个就是命名的该说的都说了嘛 ， 对吧 ？

也聊了我一桩心愿 。

**Eric** [2:12:18]
哈哈哈 ， 聊了一桩心愿 。

**吴涛** [2:12:20]
哈哈哈 ， 这我憋了好久没说了 ， 这个可以瞑目了 。

**Eric** [2:12:26]
并没有瞑目 ， 我们还要把你抓来串台 。

**吴涛** [2:12:29]
哈哈哈 ， 好的好的 。

**Eric** [2:12:31]
好了 ， 你们可以收个尾 。

**吴涛** [2:12:33]
OK， 呃 ， 您刚才收听到的节目是内核恐慌 ， 一堂贴尽量贴近计算机主技术主题的娱乐 podcast。 我们号称硬核 ，但是也没有什么干货 ， 想听人听 ，不想听人就别听 。

我们的网址是 pan.icu， 您可以在网站上找到订阅我们节目的方法 ，以及联络我们的方式 。 如果您期待我们更频繁的更新节目 ， 欢迎您到爱发电为我们捐款 ， 捐款地址是爱发电 .net slash at kernelpanic。

先发电后催更 ， 文明催更从你做起 。 如果您觉得意犹未尽 ，也欢迎也欢迎您去收听 Rio 和黄海主播的疯投圈 ，Rio 和任宁主播的提前怀旧 ，以及基本不由吴涛主播的自谈自唱 。

**Eric** [2:13:17]
哈哈 ， 好了 。

**吴涛** [2:13:20]
我们的那个那个发电链接太长了 ， 你要念它去我们官网点链接啊 ， 谁记得住啊 。

**Eric** [2:13:26]
哈哈哈 ， 说的是回头把这个删了 。

**吴涛** [2:13:29]
好吧 ， 那就再次感谢大家收听本期的自谈自唱的串台节目 ， 自谈自串啊 。 如果大家对我们的节目有什么意见或者反馈呢 ， 都可以写邮件给我们的邮箱 ， 地址是 podcast@the type.com，P-O-D-C-A-S-T at T-H-E-T-Y-P-E dot C-O-M。

同时呢 ， 大家也可以在推特 ，在微信以及在微博上面搜索 The Type， 找到我们 T-H-E-T-Y-P-E，在 Facebook 上搜索 The Type 或者 Type is beautiful， 都可以找到我们 。

**Eric** [2:13:59]
这比我们啰啰嗦多了 ， 我觉得 。

**吴涛** [2:14:02]
没有对比就没有伤害 。

**Eric** [2:14:05]
自谈自唱基本上是不需要催更的 ， 我们是隔周二播出啊 ， 从开播以来就从来没有间断过 。 所以呢 ， 大家可以顺便来给我们催更的话呢 ， 来加强我们的自谈自串的这样一个串台节目的催更工作 。

**吴涛** [2:14:21]
专门催自谈自串 。

**Eric** [2:14:23]
希望我们下次的这个串台不会一年之后再见 。

**吴涛** [2:14:28]
OK。

**Eric** [2:14:29]
好 ， 感谢大家的收听 ， 本次节目是 Eric 在 Mac OS 上剪辑制作完成的 ， 我们下次节目再见 ， 拜拜 。

**吴涛** [2:14:37]
拜拜 。

**Eric** [2:14:38]
拜拜

。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
