根本原因是终端、脚本文件、php输出三者编码不一致;需统一为utf-8无bom,windows下用chcp 65001切换代码页,php脚本中显式处理utf-8字符串,避免自动猜码。

命令行运行 PHP 脚本乱码,根本原因不是 PHP 本身没编码设置,而是终端、脚本文件、PHP 输出三者编码不一致。PHP 默认不强制声明输出编码,echo 或 print 直接按字节输出,终端按自己默认编码(如 Windows 的 GBK)去解码 UTF-8 字节流,就显示为乱码。
确认脚本文件实际编码格式
很多乱码问题根源在文件保存时用了错误编码:
- 用 VS Code / Sublime / Notepad++ 打开脚本,看右下角状态栏显示的是
UTF-8还是GBK(Windows 记事本尤其容易默认存为 ANSI/GBK) - 务必保存为
UTF-8 无 BOM—— BOM 会导致Warning: Cannot modify header information或开头多出不可见字符 - Linux/macOS 终端一般原生支持 UTF-8,但 Windows CMD/PowerShell 默认是
GBK(代码页 936),所以即使脚本是 UTF-8,也会错解
Windows 命令行临时切编码(最常用解法)
在运行脚本前,用 chcp 切换当前 CMD 窗口的活动代码页:
-
chcp 65001→ 切到 UTF-8(65001 是 UTF-8 的代码页号) - 再执行
php script.php,只要脚本本身是 UTF-8 无 BOM,就能正常显示中文 - 注意:此设置只对当前 CMD 窗口有效,关闭即失效;PowerShell 需额外执行
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 如果
chcp 65001报错“无效代码页”,说明系统未启用 UTF-8 支持(Win10 1903+ 可在「设置 → 时间和语言 → 语言 → 管理语言设置 → Beta 版:使用 Unicode UTF-8 提供全球语言支持」勾选启用)
PHP 脚本内控制输出行为(辅助手段)
PHP 本身不处理终端编码,但可主动干预输出内容的解释方式:
立即学习“PHP免费学习笔记(深入)”;
- 在脚本开头加
mb_internal_encoding('UTF-8');,影响mb_*系列函数的行为(如mb_strlen),但不影响echo输出编码 - 若脚本会输出到浏览器或 HTTP 环境,可用
header('Content-Type: text/html; charset=utf-8');,但这对 CLI 模式完全无效 - CLI 下真正能起作用的是:确保所有字符串字面量、
file_get_contents()读取的文件、数据库查询结果都明确是 UTF-8 编码;避免混用iconv('GBK', 'UTF-8', $str)等转换逻辑,除非你确定源头是 GBK
终极建议:统一环境 + 显式声明
不要依赖 PHP 自动猜编码,也不要指望终端自动适配:
- 编辑器保存为
UTF-8 无 BOM - Windows 下每次打开 CMD 先跑
chcp 65001(可写成批处理或 alias) - Linux/macOS 一般无需操作,但可通过
locale命令确认LANG是en_US.UTF-8或类似值 - PHP 脚本里所有涉及中文的地方(如提示文字、日志内容)都视为 UTF-8 字符串处理,不加额外转码
最容易被忽略的是:脚本里调用 exec() 或 shell_exec() 执行外部命令时,子进程的编码可能继承自父终端,也可能被系统 locale 覆盖——这时候光改 PHP 没用,得同步检查 shell 环境变量和外部程序本身的编码支持。











