炼金中...

幸运兔脚

不要使用Windows自带记事本写代码
简述最近开始学习HTML和CSS编程,在选择编辑器的时候看到了一篇非常有意思的文章“关于Windows下的弱智记事...
扫描右侧二维码阅读全文
09
2018/11

不要使用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 问题

Last modification:December 19th, 2018 at 09:46 am
If you think my article is useful to you, please feel free to appreciate

3 comments

  1. 星河酱

    兔脚兔脚,好久没更新了啊

    1. 幸运兔脚
      @星河酱

      随性更新,有想法就更,没想法就鸽∠( ᐛ 」∠)_

  2. Noob

    比起记事本,我更喜欢用webstorm,记事本太费时间了

Leave a Comment