根本原因是Composer仅支持无BOM的UTF-8编码,记事本等编辑器保存的“UTF-8”常含BOM导致解析失败;可用xxd或VS Code右下角编码标识确认,推荐用VS Code/Sublime Text保存为UTF-8(无BOM),或用sed/PowerShell清除BOM。

Composer 读取 composer.json 时出现中文乱码,根本原因不是文件编码本身,而是 Composer 默认只接受 UTF-8 编码且**不带 BOM**——哪怕你用记事本存成 UTF-8,它大概率偷偷加了 BOM,composer install 就会报错或解析失败。
怎么确认是 BOM 导致的乱码?
直接用命令行检查:xxd composer.json | head -n1(Linux/macOS)或用 VS Code 打开并看右下角编码标识。如果显示 UTF-8 with BOM,基本就是它了。错误现象通常是:JSON decode error: Syntax error、Invalid argument supplied for foreach(),或者中文字段完全消失、变成 \uXXXX 但又没报错——说明 JSON 解析勉强过了,但后续 PHP 处理时字节流错位。
用什么工具安全保存 UTF-8 无 BOM?
别信编辑器右下角写的“UTF-8”——很多编辑器默认带 BOM。实操建议:
- VS Code:右下角点击编码 → 选
Save with Encoding→ 选UTF-8(注意不是UTF-8 with BOM) - Sublime Text:
File → Save with Encoding → UTF-8(同样避开带 BOM 选项) - 命令行快速清除(已存在 BOM 的文件):
sed -i '1s/^\xEF\xBB\xBF//' composer.json(Linux/macOS),Windows 可用PowerShell -Command "(Get-Content composer.json -Raw) -replace \"\uFEFF\", \"\" | Set-Content composer.json -Encoding UTF8\"
为什么不能用 GBK 或其他编码?
Composer 内部用 PHP 的 json_decode() 解析,而该函数强制要求输入为 UTF-8 字符串。即使你把 composer.json 存成 GBK,PHP 也会按字节原样传给 json_decode(),结果必然失败。这不是 Composer 的限制,是 JSON 规范本身的要求——RFC 7159 明确规定 JSON 文本必须是 UTF-8、UTF-16 或 UTF-32,而 Composer 只实现了 UTF-8 路径。
CI/CD 环境下怎么防坑?
Git 提交时容易忽略编码问题,尤其 Windows 开发者本地改完直接 push,Linux 构建机拉下来就挂。建议:
- 在项目根目录加
.editorconfig,明确写charset = utf-8和trim_trailing_whitespace = true - CI 脚本里加校验:
if [ $(head -c 3 composer.json | xxd -p) = "efbbbf" ]; then echo "BOM detected!"; exit 1; fi - 团队统一用 VS Code + EditorConfig 插件,比口头约定靠谱得多
真正麻烦的不是改一次编码,而是 BOM 隐蔽性强、错误表现不一致——有时只是某个中文注释不显示,有时整个 autoload 失效。盯住 xxd 输出前三字节,比猜半天配置快得多。










