添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

1 正反斜线——历史的眼泪
  • 1.1 上古时代
  • 1.2 木已成舟,千古流传
  • 2 ¥ 与 ₩,傲娇的微软

    正反斜线——历史的眼泪

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

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

    那还是 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
  • 我们是电子科技大学百度校园菁英俱乐部。

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

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