幸运的兔脚

2018年11月09日

不要使用Windows自带记事本写代码

最近开始学习 HTML 和 CSS 编程,在选择编辑器的时候看到了一篇非常有意思的文章“关于 Windows 下的弱智记事本”。

文章中这样写道:
Windows 下自带的记事本致命缺陷:千万不要使用 Windows 自带的记事本编辑任何文本文件。原因是 Microsoft 开发记事本的团队使用了一个非常弱智的行为来保存 UTF-8 编码的文件,他们自作聪明地在每个文件开头添加了 0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载 Notepad++、Editplus 等代替记事本,不但功能强大,而且免费!记得把 Notepad++的默认编码设置为 UTF-8 without BOM(由于兼容性,带 BOM 的 utf-8 在一些浏览器中显示为乱码)即可。

BOM 标记

看到这里,大致已经可以理解一些了,因为 BOM 在文件头部添加了一些字符,所以导致文件出现了异常,那么这个0xefbbbf字符究竟是什么东西呢?逐查之:

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode 编码标准中用于标识文件是采用哪种格式的编码。
引自百度百科——BOM
通过百科的描述,可以得知0xefbbbf正是 UTF-8 的 BOM 值。

因为 Unicode 可以采用 16 位或者 32 位编码,所以计算机在处理时需要知道其字节顺序,BOM 就是用来标识字节流的字节顺序的,但字节顺序这个概念对 UTF-8 来说是没有意义的,所以 BOM 对 UTF-8 同样没有意义。然而 Unicode 标准 BOM 却在 UTF-8 编码格式中存在,其存在位置在文件开头,以三个字节 0xEF, 0xBB, 0xBF 表示。

UTF-8 编码不推荐使用无意义的 BOM,但许多 Windows 程序却在保存 UTF-8 编码的文件时将其存为带 BOM 的格式(即在文件开头加上 0xEFBBBF 三个字节),这么干的就包括 Windows 记事本。这是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以 UTF-8 编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP 来说,BOM 是个大麻烦。
PHP 并不会忽略 BOM,所以在读取、包含或者引用这些文件时,会把 BOM 作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为 0,也无法让整个网页紧贴浏览器顶部。

因此,在编辑 UTF-8 的文件时,建议不要使用记事本等进行编辑,虽然保存后的文件仍然是 UTF-8,但却已经不再是保存前的 UTF-8 了,这在使用这些文件的时候可能就会因为编码而出现问题。

解决方法

那么万一手抖用记事本打开了文件该怎么办呢?
去掉 UTF-8 编码文件 BOM 的方法有这几种:用 Notepad++的 Encoding 菜单中的 Encoding in UTF-8 without BOM 即可;用任何 16 进制编辑器将文件前三个字节去掉;或者更简单的——用 VIM 设置 UTF-8 编码的 BOM 标记

总结

查看了不少资料之后,发现 BOM 可以影响的范围并不大,主要还是在 PHP 上会出现问题,不过俗话说的好“工欲善其事,必先利其器”我们完全可以选择一个好一点的工具来开始学习编程,例如 notepad、vscode、sublime 等文本编辑器,或者直接选择各种的 IDE,这样可以更有效率的进行编程学习。

参考文章:
BOM 标记
utf-8 编码的 byte order mark 问题