php7.3读取文件时需手动检测并剥离utf-8 bom:用substr($str,0,3)===""判断,匹配则substr($str,3)去除;推荐封装strip_utf8_bom()函数,读取后立即处理,避免json解析失败或headers already sent错误。

PHP7.3 读取文件时怎么检测并剥离 UTF-8 BOM
PHP 本身不会自动忽略或剥离 BOM,file_get_contents() 读出来的字符串开头如果带 BOM(),就会原样保留。这会导致 JSON 解析失败、XML 格式错误、trim() 无效、甚至 header() 报“headers already sent”——尤其在 require/ include 了带 BOM 的 PHP 文件时最典型。
判断是否含 BOM 很简单:检查字符串前三个字节是否等于 ;去除它只需截掉开头匹配的部分。
实操建议:
- 不要依赖
mb_detect_encoding()判断 BOM——它不保证识别出 BOM,且可能误判 - 优先用二进制方式检测:用
substr($str, 0, 3) === "" - 去除后记得用
ltrim($str, "")不够可靠,因为ltrim是按字符集合裁剪,而 BOM 是三字节序列,必须整体匹配移除 - 推荐封装成小函数复用:
function strip_utf8_bom(string $s): string {
if (substr($s, 0, 3) === "") {
return substr($s, 3);
}
return $s;
}
读取文件后立即处理 BOM 的典型写法
别等后续逻辑才发现输出异常,应在 file_get_contents() 后立刻清理。特别是处理配置文件、JSON、CSV 或模板内容时。
常见错误场景:
- 直接
json_decode(file_get_contents('config.json'))→ 返回null,但json_last_error_msg()显示 “Syntax error”,实际就是 BOM 卡在开头 - 用
include引入一个看似空的 PHP 文件,却触发 headers already sent —— 检查该文件是否用记事本保存过(默认加 BOM)
安全写法示例:
$content = file_get_contents('/path/to/file.txt');
$content = strip_utf8_bom($content); // 立即清理
// 后续可放心 json_decode / simplexml_load_string / explode("
", $content)
为什么不能靠编辑器“另存为 UTF-8 无 BOM”一劳永逸
现实项目里你不一定能控制所有文件来源:第三方 SDK、用户上传的文本、CI 构建生成的临时文件、甚至 Git 在某些换行设置下会悄悄引入 BOM(少见但存在)。硬性要求所有人改编辑器设置不现实,运行时防御更可靠。
注意点:
-
strip_utf8_bom()对非 UTF-8 编码文件(如 GBK、ISO-8859-1)无效,也不会损坏内容——因为那三个字节在其他编码里通常不是合法字符开头,检测自然不匹配 - PHP7.3 已废弃
mb_regex_encoding()等正则多字节函数,所以别试图用mb_ereg_replace()去 BOM,substr 方案最轻量、最稳定 - 如果文件极大(>100MB),避免一次性
file_get_contents(),可改用fopen()+fgets()流式读取,并在首行做 BOM 检测和跳过
require/include 带 BOM 的 PHP 文件怎么提前规避
这个不是字符串处理问题,而是 PHP 解析器层面的问题:只要 .php 文件以 BOM 开头,解析时就会把 BOM 当作输出内容,导致 headers already sent 错误,且无法用任何 PHP 函数拦截或修复。
唯一有效解法是预防:
- 用
grep -rl $'\xEF\xBB\xBF' ./src批量扫描项目中带 BOM 的 PHP 文件(Linux/macOS) - 用 VS Code、PhpStorm 等编辑器打开后,右下角看编码显示,点击切换为 “UTF-8”(不含 BOM)再保存
- Git 提交前加 pre-commit hook,用脚本拒绝带 BOM 的 .php 文件入库
BOM 在 PHP 文件里没有业务价值,只有破坏性。字符串级的 strip 只适用于你读取的是纯内容(比如 config.json),对 PHP 代码本身,必须从源头清除。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











