冷知识:Windows 目录分隔符之谜

接手了一个公众号,每个月有一些文章篇数的需求。摘录一二自觉质量尚好者,存档于此。

同时使用 Windows 与 *NIX 系统的同学,想必对 Windows 特立独行的目录分隔符记忆颇深:在主流操作系统中,只有 Windows 的目录分隔符是反斜线「\」;而在其他各大系统中,如 Linux、macOS,目录分隔符都是「/」。

当然,世界上操作系统的主要流派大致也就分为 Windows 与 *NIX(包含 Linux、macOS 等)了,所以其他系统一致使用「/」也不难理解——但是,究竟为什么 Windows 非要用方向相反的这种斜线呢?而且在日文版系统中,目录的分隔符竟然是 「¥」,在韩文版系统中是「」。常用日文版 Windows 推黄油的同学肯定有所体会,但为何会这样呢?

正反斜线——历史的眼泪

或许只是强迫症,但作为写程序的人,我对「\」这种反斜线是相当反感的:一般编程语言中反斜线代表了转义字符,所以在代码中表示文件路径 \ 需要写成 \\;而且在中文输入法下,\ 这个键通常输入的是顿号 ;有的时候,还会降低程序的可移植性。综上所述,这个反斜线相当令人不爽。

所以到底为什么会这样?其实如计算机中许多奇奇怪怪的传统一样,这是一个极为古老的历史遗留问题。

上古时代

那还是 MS-DOS 1.0 的年代,上世纪的八十年代初。微软和 IBM 公司刚刚开始蜜月期,MS-DOS 安装到了 IBM 的每一台 PC 之上,为微软占据了巨大的市场份额,也为后来的 Windows 的成功奠定了基础——这是后话。在当时,PC 机的配置很非常简陋,DOS 支持的外存也只有软盘,这也就带来了另一个结果:MS-DOS 1.0 并不支持任何的目录结构。它支持多个盘符,但不支持任何目录。

而当时已如日中天的 UNIX,这是另一番光景:由于多运行在相对配置较高的大中型机,再加上其「一切皆文件」的哲学,目录结构自然是必不可少的。UNIX 早已选定了「/」作为其目录的分隔符。

到了两年后的 MS-DOS 2.0,事情发生了转变:MS-DOS 终于支持了 10 MiB 容量的硬盘!微软的程序员欢天喜地,准备趁此机会给 DOS 加入目录功能,但他们遇上了一个难解的问题:「/」这个符号已经被作为参数的前导字符被占用了。

在 *NIX 系统中,参数的前导字符是「-」,所以传递参数类似于 ./pram1 -a arg1 -b arg2,而到了 MS-DOS 上,就成了 pram1 /a arg1 /b arg2(直至今日系统程序依然如此)。据说,这是因为 MS-DOS 1.0 的程序员有很多来自 IBM 公司,而「/」来传递参数是他们的传统。

木已成舟,千古流传

要修改一件已经约定俗成的事情,那是十分困难的。如果将目录分隔符定为「/」,势必会出现混淆;而若修改参数的前导符号,又会造成大量的不兼容。

那该怎么办呢?答案你早已知道。微软的程序员们采用了一个相当随便的做法:他们选了「\」这个长得和「/」很像的符号。他们或许考虑过使用点号「.」,但这个符号也用来分隔文件名和扩展名了。

这就是「\」这一符号的来历。

有一个罕为人知的事实,那就是 DOS 的程序员也很嫌弃「\」这个符号,因为他们很多使用的是 Xenix 系统(微软的 UNIX 衍生版),更熟悉 UNIX 的命令。所以他们让 MS-DOS 既接受「\」符号,也接受「/」符号(在今天很多地方也是如此)。他们甚至悄悄加了一个系统调用,让用户可以将目录分隔符修改为「-」——成功翻转了 UNIX 中「-」和「/」的用途。

多年之后,「\」作为目录分隔符的传统就从 MS-DOS 流传到了 Windows,直到今天。在可预见的未来,这一事实大概都不会改变。

¥ 与 ₩,傲娇的微软

了解了 Windows 将「\」作为目录分隔符的历史,那么「¥」和「」又是怎么一回事呢?在日文版系统中,目录分隔符显示的是「¥」,在韩文版系统中,显示的又是「」——恰好是日本与韩国的货币单位符号。那英文版系统怎么又不是「$」呢?

其实这又关乎到微软的一大傲娇之处了:打死不用 Unicode。

拒绝 Unicode 的忧伤

微软似乎很不喜欢 Unicode,非常不喜欢。

从记事本程序就可见一斑:你在中文版系统中用记事本程序,保存的文件默认就是中国的 GBK 编码;你若强制保存为 UTF-8 格式,微软会给你保存为所谓的 UTF-8 BOM 编码:在文件头加几个字节表示这是 UTF-8 编码,在 *NIX 系统中通常会造成文件头乱码。

而命令提示符中也是如此,直到最近,微软才为 Windows 10 系统中的命令提示符加入了 UTF-8 支持——Beta 版!目录名也是如此,还记得在中文版 Windows 下解压黄油解出的一堆乱码吗?

Windows 既然如此热爱开历史的倒车,目录分隔符这里也不例外。在日文版的 Windows 里,「\」就是显示为 「¥」的。没错,它们在编码上、在二进制的层面上,是一模一样的,就是显示出来不一样。在韩文版系统中,也是相似的原理。

其实这一点除了美观因素之外,没有太大的坏处。既然实际的编码一样,使用其他语言 Windows 的程序员也只需要使用「\」就行了。只是微软,这到底是何苦呢?

参考资料:

  • https://blogs.msdn.microsoft.com/larryosterman/2005/06/24/why-is-the-dos-path-character/
  • https://blogs.msdn.microsoft.com/oldnewthing/20051014-20/?p=33753
  • https://stackoverflow.com/questions/7314606/get-directory-separator-char-on-windows-etc

我们是电子科技大学百度校园菁英俱乐部。

如果你有兴趣与我们一起学习、分享知识,或与我们一起出去见见外面的世界,欢迎加入我们!

请实时关注我们的动态,同时也可以在公众号内留言。

发表评论

电子邮件地址不会被公开。 必填项已用*标注