文本文件加不加 BOM?

问题

文本文件加 BOM 有何好处?有何坏处?到底加不加?

说法

  1. UTF-8 不需要 BOM,不含 BOM 的 UTF-8 才是标准形式,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。

  2. 文本文件带 BOM 不是个标准的做法,而且可能会导致某些 reader 或者编辑器解析出错,所以一般不推荐文本文件去携带 BOM。

分析

人们写文本文件肯定有不同目的,所以,加和不加可能分别适用于不同目的,不能一概地认为哪种更好。

更聪明的做法是分类对待,可以根据以下基本原则:

  • 在有结构的文件里,不需要 BOM。

  • 在没有结构的文本文件里,最好有 BOM(见下面“兼容问题”)。

举例 1:.html, .xml 等文件有结构,不需要。

举例 2:.txt 没有结构,如果不加 BOM,软件需要自己判断,很可能判断失误出现乱码,或者为了正确判断付出巨大代价。

举例 3:带 shebang line 的文件,有结构,如果加了 BOM,会使弱鸡 Shell 不认识而出错。

举例 4:.cpp, .hpp,没有结构,里面如果没有中文、法语等 ASCII 码大于 127 的字符,加不加都无所谓,如果带中文,哪怕是注释,建议 UTF-8 with BOM。

毕竟稣有 20 几台电脑,涵盖 Windows、macOS、Linux 系统和 x86、x64、armhf、arm64 架构,没有 BOM 怎么愉快地写 C++?

兼容问题

本节,只针对没有结构的文本文件。

遇到阅读器/编辑器不支持的情况,那就是不加好,但并不是绝对,因为这其实还是个需求问题。

比如说,稣一直用 Windows 的记事本写一些备忘,如果汉字局多,就选择 UTF-16 LE with BOM,代码居多则用 UTF-8 with BOM。这些文件换用其它软件打开也许会乱码,但有何关系呢?他们可以写出不支持 BOM 的擸𢶍软件,稣也可以不用呀!稣在 macOS、Linux 上都可以拿支持 BOM 的软件(比如 VSCode)打开这些文件。

再考虑一种死翘翘的情况:您在用 B 语言写代码,但它的编译器不支持 BOM,那么显然您就不应该加了。

所以,当您的文本文件的主程序不支持 BOM 时,不应该加,支持的情况,还是加的好。