Composer本身不处理中文编码,仅依赖PHP的json_decode()按UTF-8解析composer.json;乱码主因是文件非UTF-8无BOM编码、含BOM头或中文注释,需用VS Code等编辑器保存为UTF-8(无BOM)并禁用自动转GBK插件。

Composer 本身不处理中文编码,别在 composer.json 里折腾 UTF-8 声明
Composer 是依赖管理工具,不是字符编码处理器。它读取 composer.json 时只依赖 PHP 的 JSON 扩展,默认按 UTF-8 解析——前提是文件本身保存为 UTF-8 无 BOM。如果你的 composer.json 里中文乱码(比如显示成 或一堆问号),问题一定出在编辑器保存编码上,不是 Composer 配置能解决的。
常见错误现象:composer install 报错 JSON decode error: Syntax error,或包名/描述字段显示异常。
- 用 VS Code、PhpStorm 等现代编辑器时,右下角确认状态栏显示 “UTF-8”,不是 “GBK” 或 “ISO-8859-1”
- Sublime Text 用户务必关闭 “Save with Encoding” 自动转 GBK 的插件
- Windows 记事本保存的
composer.json几乎必带 BOM,直接导致解析失败,换编辑器重存
PHP 脚本读取 Composer 加载的中文资源时,file_get_contents() 默认不指定编码会出问题
Composer 安装的包(比如一个含中文配置的 YAML 文件或 JSON 接口响应)被 PHP 脚本读取时,file_get_contents() 返回的是原始字节流,不自动转码。如果后续用 json_decode() 或 mb_substr() 处理,而没声明输入是 UTF-8,就会截断、乱码或抛出警告。
使用场景:读取第三方包里的 lang/zh_CN.json,或解析 Composer 插件返回的含中文的 API 响应。
立即学习“PHP免费学习笔记(深入)”;
-
json_decode(file_get_contents($path), true)可以正常工作——前提是文件是 UTF-8 且无 BOM,json_decode内部强制按 UTF-8 解析 - 但读取纯文本(如
.txt或.md)时,必须显式指定编码:mb_convert_encoding(file_get_contents($path), 'UTF-8', 'auto') - 避免用
iconv('GBK', 'UTF-8//IGNORE', ...),PHP 8.2+ 已废弃//IGNORE,改用mb_convert_encoding+mb_substitute_character('none')
composer dump-autoload 不影响中文字符串运行时行为,但 autoloader 生成的文件若含中文注释可能触发 warning
Composer 自动生成的 vendor/autoload.php 和相关 classmap/psr-4 映射文件是 PHP 代码,里面不含业务字符串。但如果你在类文件的 PHPDoc 注释里写了中文,并且启用了某些静态分析工具(如 PHPStan)或 IDE 的严格检查,可能报 Invalid UTF-8 sequence ——这其实是 PHP 解析器对源码编码的校验,不是 Composer 的锅。
- 确保所有
.php源文件保存为 UTF-8 无 BOM,特别是含中文注释或/** @var string $中文变量 */这类写法 - PHP 7.4+ 默认接受 UTF-8 字符作为标识符(如
function 你好() {}),但 Composer 不参与这类语法解析,也不推荐这么写 - 如果用
composer dump-autoload -o(优化模式),生成的vendor/composer/autoload_classmap.php是纯 ASCII,中文只出现在注释里,不影响执行
终端输出中文乱码?和 Composer 无关,但常被误认为是它的问题
执行 composer require xxx 后,命令行显示中文变成方块或问号,这不是 Composer 编码设置问题,而是终端环境不支持 UTF-8 或未正确设置 locale。
- Linux/macOS:检查
locale输出是否含UTF-8,不是POSIX;临时修复:export LANG=en_US.UTF-8 - Windows CMD:默认用 GBK,
chcp 65001切换 UTF-8,但部分旧版 Composer( - Git Bash 用户注意:其默认编码是 UTF-8,但若 Windows 区域设置为中文(非 Unicode 程序用 GBK),PHP 内部
echo可能仍走 GBK,需在脚本开头加mb_internal_encoding('UTF-8')
真正容易被忽略的是:PHP CLI 的默认内部编码(mb_internal_encoding())在不同系统上可能不同,而 Composer 脚本运行时继承这个值——哪怕你的 composer.json 和源码都 UTF-8,输出环节也可能掉链子。



















