PHP文件开头的UTF-8 BOM头(0xEF 0xBB 0xBF)会导致空白输出、JSON解析失败等问题;可通过Notepad++转码、sed命令、PowerShell脚本、PHP遍历脚本或ltrim()运行时过滤五种方法清除。

如果您在网页中嵌入 PHP 文件(如通过 include、require 或 AJAX 请求)时出现空白输出、JSON 解析失败、HTTP 头已发送错误或页面乱码等问题,很可能是目标 PHP 文件开头存在 UTF-8 BOM 头。BOM(Byte Order Mark)是三个不可见字节 0xEF 0xBB 0xBF,位于文件最前端,会提前触发 HTTP 输出,破坏 header()、session_start() 等函数的正常执行。以下是清除 BOM 头的具体方法:
一、使用文本编辑器手动清除
该方法适用于少量 PHP 文件,原理是借助支持编码识别与无 BOM 保存的编辑器,强制以 UTF-8 无签名格式重写文件,从而剥离头部隐藏字节。
1、用 Notepad++ 打开待处理的 PHP 文件。
2、点击顶部菜单栏【编码】→【转为 UTF-8 无 BOM 格式】。
立即学习“PHP免费学习笔记(深入)”;
3、点击【文件】→【保存】,覆盖原文件。
4、若需批量处理,可选中多个文件后右键 →【以 UTF-8 无 BOM 编码打开】,再逐个执行步骤 2 和 3。
二、使用命令行工具批量清除(Linux/macOS)
该方法适用于服务器端批量处理大量 PHP 文件,原理是利用 sed 工具精准定位并删除每文件开头的 BOM 字节序列,不改变其余内容结构。
1、进入 PHP 项目根目录,执行以下命令扫描并清除所有 .php 文件的 BOM:
2、运行:find . -type f -name "*.php" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;
3、验证某文件是否仍含 BOM:执行 hexdump -n 3 -C yourfile.php,若输出中无 ef bb bf 即表示清除成功。
三、使用 PowerShell 清除(Windows 环境)
该方法适用于本地开发环境为 Windows 的场景,原理是读取文件原始字节流,判断前三位是否为 BOM,若是则截取后续内容并以 UTF-8 编码(无 BOM)重新写入。
1、以管理员身份打开 PowerShell。
2、切换至项目目录,执行以下脚本:
3、$files = Get-ChildItem -Recurse -Filter "*.php"; foreach ($f in $files) { $content = Get-Content $f.FullName -Raw -Encoding Byte; if ($content[0] -eq 0xEF -and $content[1] -eq 0xBB -and $content[2] -eq 0xBF) { $clean = $content[3..($content.Length-1)]; [System.IO.File]::WriteAllBytes($f.FullName, $clean) } }
四、使用 PHP 脚本自动遍历清除
该方法适用于无法直接操作服务器命令行但拥有 PHP 运行权限的环境,原理是构建递归文件扫描器,对每个 PHP 文件读取前 3 字节比对 BOM,命中则截断并覆写。
1、新建一个名为 clear_bom.php 的文件,放入网站根目录。
2、写入以下代码:
3、"; } } function scanDir($dir) { $files = scandir($dir); foreach ($files as $file) { if ($file === '.' || $file === '..') continue; $path = $dir . '/' . $file; if (is_dir($path)) { scanDir($path); } elseif (pathinfo($path, PATHINFO_EXTENSION) === 'php') { removeBOM($path); } } } scanDir(__DIR__); ?>
4、通过浏览器访问 http://yoursite.com/clear_bom.php,脚本将自动执行并输出已处理文件列表。
五、使用 ltrim() 函数在运行时过滤(临时兼容方案)
该方法不修改源文件,而是在 PHP 运行时对读取的内容做即时清洗,适用于无法修改文件权限或仅需临时规避 BOM 导致的输出异常场景。
1、在包含或读取外部 PHP 文件内容前,使用 ltrim 剥离可能存在的 BOM 字符串:
2、$content = file_get_contents("target.php"); $content = ltrim($content, "\xEF\xBB\xBF");
3、若用于 JSON 输出,可在 json_encode 后统一前置清洗:$json = json_encode($data); $json = ltrim($json, "\xEF\xBB\xBF"); echo $json;











