json_decode()遇bom(ef bb bf)直接返回null且不报行号,非语法错误;可用xxd或bin2hex确认,运行时用ltrim($raw, "\xef\xbb\xbf")清除,保存文件应选utf-8无bom格式。

PHP 的 json_decode() 遇到 BOM(\xEF\xBB\xBF)会直接返回 null,且不报具体错误行号——这不是 JSON 语法错,而是开头三个不可见字节干扰了解析。
怎么确认是 BOM 导致的?
用十六进制工具查看原始字符串或文件前几个字节:
- Linux/macOS:运行
xxd -l 8 your_file.json | head -n1或hexdump -C -n 3 your_file.json - 如果输出含
ef bb bf,就是 UTF-8 BOM - 在 PHP 中可临时检查:
bin2hex(substr($json, 0, 3)) === 'efbbbf'
运行时清除 BOM(推荐用于 API 响应)
接收外部 JSON(如 cURL、file_get_contents)后,先清理再解析:
- 用
ltrim($raw, "\xEF\xBB\xBF")去掉开头 BOM(安全、轻量) - 加上
JSON_THROW_ON_ERROR避免静默失败:$data = json_decode(ltrim($raw, "\xEF\xBB\xBF"), true, 512, JSON_THROW_ON_ERROR); - 若不确定是否含 BOM,也可统一用
mb_convert_encoding($raw, 'UTF-8', 'UTF-8')清理编码杂音
源头修复:保存文件时不带 BOM
BOM 多来自编辑器误保存,尤其 Windows 记事本、旧版 VS Code 默认带 BOM:
- VS Code:右下角点击编码名 →「Save with Encoding」→ 选 UTF-8(不是 “UTF-8 with BOM”)
- Notepad++:菜单【编码】→【转为 UTF-8 无 BOM 格式】→ 保存
- Linux/macOS 批量清理:
find . -name "*.json" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;
别忽略 HTTP 输出提前触发的问题
PHP 文件自身带 BOM 时,哪怕只是 require 'config.php';,BOM 也会被当作响应体提前输出,导致:
• header() 报 “headers already sent”
• session_start() 失败
• AJAX 返回 JSON 前多出空白,前端 JSON.parse() 报错
这类问题要查所有被 include/require 的 PHP 文件,用 grep -rl $'\xEF\xBB\xBF' ./ 扫描项目目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











