在 Ubuntu 上 PHP 日志出现乱码,通常不是 PHP 本身“坏了”,而是字符编码不一致或输出环境不支持中文/特殊字符导致的。下面按常见原因给你梳理:
如果 PHP 文件保存为 GBK / ANSI,但系统/终端按 UTF-8 解析,就会乱码。
✅ 解决:
file -i your_script.php
如果不是 utf-8,用编辑器(VS Code / PHPStorm)转成 UTF-8 无 BOM。
header('Content-Type: text/html; charset=utf-8');
CLI 模式下没用,但 Web 日志 / 页面输出 会受影响。
Ubuntu 默认是 UTF-8,如果你用 echo 写中文到日志:
error_log("中文测试");
但日志文件原来是 GBK 创建的,就会乱码。
✅ 解决:
iconv -f gbk -t utf-8 /var/log/php_errors.log
或者清空日志重新生成:
> /var/log/php_errors.log
locale
应看到:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果不是:
sudo apt install locales
sudo locale-gen en_US.UTF-8
SSH 工具(Xshell / PuTTY)也要设置为 UTF-8。
CLI 模式:
php test.php
如果直接 echo 中文乱码:
echo "中文";
✅ 解决:
export LANG=en_US.UTF-8
确保:
charset utf-8;
AddDefaultCharset UTF-8
如果你用了 substr(不是 mb_substr):
substr("中文", 0, 1); // 乱码
✅ 正确:
mb_substr("中文", 0, 1, "UTF-8");
你可以按顺序检查:
如果你愿意,可以把下面信息发我:
locale 输出php -i | grep -i error我可以直接告诉你是哪一层出的问题。