Composer JSON 解析失败90%是编码问题,需确保 composer.json 为无BOM的UTF-8:用 file -i 验证编码,hexdump 查BOM,grep 检非ASCII字节,并统一编辑器、Git、CI、终端的UTF-8设置。

Composer 本身不处理编码,它依赖 PHP 的 json_decode() 和终端环境——所以所谓“处理”,其实是绕过它的盲区,把输入和输出两端都对齐到 UTF-8。
composer.json 报 JSON decode error: Syntax error 怎么快速定位是不是编码问题
这个错误 90% 不是语法写错,而是文件开头有 BOM、混入 GBK 字节或控制字符。PHP 的 json_decode() 对非 UTF-8 输入直接失败,不报具体编码原因。
- 运行
file -i composer.json:输出不含charset=utf-8就基本确定不是 UTF-8 - 运行
hexdump -C composer.json | head -n 1:开头出现ef bb bf就是 UTF-8 BOM,必须删 - 运行
grep -P "\x80-\xFF" composer.json | head -n 1:有输出说明存在非 ASCII 字节,大概率是 GBK 或 Latin-1 混入 - 别信编辑器右下角显示的“UTF-8”——Windows 记事本常骗人,它标的是“UTF-8 with BOM”,而 BOM 对
json_decode()来说就是非法字节
Windows 下用记事本/VS Code/PhpStorm 保存 composer.json 容易踩哪些编码坑
核心矛盾:编辑器默认保存策略 ≠ PHP 解析要求。记事本默认“ANSI”(即当前系统 locale 编码,中文 Windows 是 GBK),VS Code 默认可能开 BOM,PhpStorm 若勾了 Transparent native-to-ascii conversion 会静默转义中文。
- 记事本:绝对禁用。它保存“UTF-8”时必带 BOM,且无选项关闭;改用 VS Code 或 Notepad++
- VS Code:右下角点编码名 → 选
Save with Encoding→ 严格选UTF-8(不是UTF-8 with BOM);再进设置搜files.encoding,设为utf8 - PhpStorm:Settings → Editor → File Encodings → Global Encoding 和 Project Encoding 都设为
UTF-8,BOM选Do not create BOM,关掉Transparent native-to-ascii conversion - Sublime Text:右下角点编码 →
Save with Encoding→UTF-8;另存为时务必确认状态栏显示的是UTF-8,不是UTF-8-BOM
Git 提交后 CI 上 composer install 崩了,但本地好好的
根本原因是 Git 在不同系统间传输时没统一文本解释方式,尤其 Windows 提交带 BOM 的文件,Linux 构建机直接解析失败。
- 在项目根目录加
.gitattributes,写一行:composer.json text eol=lf encoding=utf-8,强制 Git 当作 UTF-8 文本处理 - CI 脚本开头加校验:
if ! [[ $(file -i composer.json) == *"charset=utf-8"* ]]; then echo "composer.json not UTF-8"; exit 1; fi - 如果历史已混入 GBK 文件,用
iconv -f GBK -t UTF-8 composer.json > tmp.json && mv tmp.json composer.json转码(仅限确认源是 GBK) - 团队协作中,比技术方案更重要的是约定:禁止用 Windows 记事本改
composer.json,改完必须用file -i过一遍再提交
Windows 终端执行 composer 命令显示中文乱码
这不是 Composer 的 bug,是 Windows CMD/PowerShell 默认用 GBK 解码 UTF-8 输出。现象包括包描述变 ?、错误提示成方块、composer validate 中文字段名显示异常。
- CMD 下临时修复:先运行
chcp 65001(切换到 UTF-8 代码页),再跑composer install - PowerShell 更可靠:启动时加
-Command "chcp 65001 | Out-Null; composer install",或在$PROFILE里设$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding - Git Bash 用户:在
~/.bashrc加export LANG=UTF-8和export LC_ALL=UTF-8,并换字体为Microsoft YaHei或Consolas - 终极建议:直接用 Windows Terminal,它原生支持 UTF-8,无需任何配置
真正麻烦的从来不是怎么转一次编码,而是让整个链路——编辑器保存、Git 提交、CI 解析、终端渲染——全部默认走 UTF-8。中间任何一个环节偷偷切回 GBK 或塞个 BOM,就会在某个深夜的部署时刻突然崩给你看。


















