去除文件BOM头的方法_编辑器批量转换教程
BOM头虽然只有三个字节,但在Web开发中造成的问题非常多,而且因为不可见很难排查。PHP中最典型的报错是「Warning: session_start(): Cannot send session cookie - headers already sent」,报错信息中会指出输出开始的文件和行号,如果行号是1,基本就是BOM头导致的。验证码不显示是因为图片输出前BOM头已经输出,导致图片数据损坏。JSON接口返回的数据开头有三个不可见字符,前端JSON.parse()会失败。本文把这些典型问题的排查和解决方法整理出来,遇到类似问题可以快速定位到BOM头。
网站迁移后BOM头问题的处理。从Windows服务器迁移到Linux服务器,或从本地上传到虚拟主机,文件编码可能不一致,部分文件带BOM头。迁移后如果出现页面顶部空白、验证码不显示、登录异常,先检查文件编码。用批量PHP脚本扫描整个网站目录去除BOM头,然后清除缓存测试。迁移时建议用FTP的二进制模式传输文件,避免传输过程中编码被转换。Git/SVN版本控制的项目,在仓库中统一编码为UTF-8无BOM,检出时不会有BOM头问题。迁移后不仅检查PHP文件,还要检查HTML模板、CSS、JS、配置文件(.ini、.conf、.env),任何文本文件都可能带BOM头。
防止BOM头的最佳实践。一是统一团队编辑器设置,所有开发者设置默认保存为UTF-8无BOM,在编辑器配置或团队规范中明确。二是代码提交前检查,Git可以配置pre-commit钩子检测BOM头,SVN可以用pre-commit脚本。三是网站程序上线前用批量脚本扫描一次,确保没有BOM头。四是从官方渠道下载程序,很多第三方修改版可能带BOM头。五是PHP项目中在入口文件开头用ob_start()开启输出缓冲,可以缓冲BOM头输出,避免header失败,但这只是临时方案,根本解决还是去除BOM头。六是模板文件(HTML、CSS、JS)也要检查,不只是PHP文件。
BOM头与编码乱码的关系。BOM头本身不会导致中文乱码,乱码通常是因为文件编码和页面声明的编码不一致(文件是GBK但页面声明UTF-8,或反之)。但BOM头会加剧编码问题——带BOM头的UTF-8文件被当作GBK解析时,BOM头三个字节会显示为乱码字符(锘?)。解决乱码的根本方法是统一所有文件编码为UTF-8无BOM,同时在页面head中声明,PHP文件设置header('Content-Type: text/html; charset=utf-8'),数据库连接设置SET NAMES utf8。编码统一后,BOM头和乱码问题都能解决。
Notepad++去除BOM头。打开文件后,点击菜单「编码」-「转为UTF-8无BOM编码」,然后保存文件。底部状态栏会从「UTF-8-BOM」变为「UTF-8」。批量去除多个文件:在Notepad++中打开所有需要处理的文件,点击「编码」-「转为UTF-8无BOM编码」,然后按Ctrl+Shift+S全部保存。注意Notepad++的「编码」菜单中有「使用UTF-8无BOM编码」和「转为UTF-8无BOM编码」两个选项,「使用」是设置编辑器显示编码不改变文件内容,「转为」才是真正转换文件编码去除BOM头,一定要选「转为」。设置默认保存为无BOM:「设置」-「首选项」-「新建」,编码选择UTF-8,不勾选「应用到打开的ANSI文件」。
Sublime Text去除BOM头。Sublime Text默认保存UTF-8不带BOM。如果文件有BOM头,点击「File」-「Save with Encoding」-「UTF-8」,保存后去除BOM。注意不要选「UTF-8 with BOM」。安装「EncodingHelper」插件可以在状态栏显示文件编码和BOM状态,方便检测。设置默认编码:「Preferences」-「Settings」,添加"default_encoding": "UTF-8","show_encoding": true。Dreamweaver去除BOM头:「修改」-「页面属性」-「标题/编码」,编码选择Unicode (UTF-8),不勾选「包括Unicode签名(BOM)」,确定后保存页面。旧版Dreamweaver默认保存UTF-8时会添加BOM,需要手动取消勾选。
BOM头对PHP页面的影响。PHP引擎在执行文件时,如果文件开头有BOM头,会把这三个字节当作普通输出发送到浏览器。这导致在BOM头之后调用的header()、setcookie()、session_start()等函数失败,因为HTTP协议要求头信息必须在任何输出之前发送。报错信息通常是「Warning: Cannot modify header information - headers already sent by (output started at /path/file.php:1)」,行号是1说明输出从文件第一行开始,就是BOM头。session_start()失败会导致登录状态无法保持,setcookie()失败会导致Cookie无法设置,header('Location:')失败会导致跳转无效。
BOM头导致验证码不显示的原理。验证码图片通过PHP的GD库生成,用header('Content-Type: image/png')设置内容类型,然后输出图片二进制数据。如果PHP文件有BOM头,BOM头会在图片数据之前输出,导致浏览器接收到的数据是「BOM头 + 图片数据」,不是合法的PNG格式,浏览器无法解析,显示为叉号或空白。解决方法是去除生成验证码的PHP文件(以及include的所有文件)的BOM头。注意不仅验证码文件本身不能有BOM头,它include/require的所有文件(如数据库配置文件、函数库文件)也不能有BOM头,任何一个文件有BOM头都会导致输出异常。
开发者真实体验:「session_start()一直报headers already sent,报错行号是1,看了文章才知道是BOM头,把config.php转为无BOM后解决了」「团队里有人用旧版记事本保存文件自动加BOM,导致线上出问题,现在统一要求用VSCode默认UTF-8无BOM,提交前用脚本检查,再也没出过BOM头问题」。
经验总结:BOM头问题的核心是「不可见字符在PHP中被当作输出」,导致所有需要在输出前发送的HTTP头失败。解决思路是检测→去除→预防。检测用十六进制查看或编辑器编码显示;去除用编辑器单个转或脚本批量清;预防靠统一编辑器设置和编码规范。记住不仅PHP文件,include的所有文件、HTML模板、CSS、JS、配置文件都不能有BOM头。编码统一为UTF-8无BOM是Web开发的基本规范,从项目开始就执行能避免很多诡异问题。

更新时间:2026-08-26 23:23:10
上一篇:Typecho站点子目录 301 到新目录301配置_美橙互联虚拟主机适用