根本原因是cmd/powershell默认gbk编码(936)与laravel输出的utf-8不匹配;解决方案包括:在artisan文件首行插入exec('chcp 65001 > nul')、注册表设置autorun或powershell配置[console]::outputencoding、确保字体支持中文。

Windows 系统下 Laravel 的 artisan 命令行输出中文乱码,根本原因是 CMD 或 PowerShell 默认使用 GBK 编码(如代码页 936),而 Laravel 输出的是 UTF-8 字节流,两者不匹配导致显示为“”或方块字。Linux/macOS 通常默认 UTF-8,极少出现此问题。
修改 artisan 文件强制切换 CMD 编码
这是最直接、见效最快的方案,适用于所有 Windows 用户:
- 用文本编辑器打开项目根目录下的
artisan文件 - 在文件顶部
#!/usr/bin/env php下方(即 PHP 标签<?php后第一行)插入以下代码:
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
exec('chcp 65001 > nul');
}
其中 chcp 65001 是将当前命令行会话切换为 UTF-8 编码。加 > nul 是为了隐藏执行提示,保持输出干净。
保存后关闭所有终端窗口,重新打开一个新的 CMD 或 PowerShell,再运行 php artisan list 或 php artisan tinker,中文应正常显示。
设置终端默认编码(一劳永逸)
若希望所有 PHP 命令(不止 artisan)都默认 UTF-8,可更改系统级终端行为:
-
CMD 方案:以管理员身份运行 CMD,执行:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "chcp 65001 > nul" /f -
PowerShell 方案:编辑 PowerShell 配置文件(
$PROFILE),添加:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
重启终端后生效,后续无需每次改 artisan 文件。
检查 PHP 自身输出是否被干扰
极少数情况是 PHP 输出缓冲或扩展影响了编码:
- 确认
php.ini中default_charset = "UTF-8"(注意是带连字符的UTF-8,不是utf8) - 禁用可能冲突的扩展(如某些中文本地化扩展),测试是否恢复
- 运行
php -r "echo '中文';"看原生 PHP 是否乱码——如果也乱码,说明是系统终端或 PHP 配置问题,而非 Laravel 特有
避免在 tinker 中因字体导致的“假乱码”
有时显示异常并非编码问题,而是终端字体不支持中文:
- 右键 CMD 标题栏 → “属性” → “字体”,选择支持中文的等宽字体(如“Lucida Console”“Consolas”或“微软雅黑”)
- PowerShell 可在“属性→字体”中选“NSimSun”或启用“使用旧版控制台”
- 推荐使用现代终端如 Windows Terminal(Microsoft Store 免费下载),它对 UTF-8 和 emoji 支持更完善











