在 CentOS 上 PHP 日志出现乱码,通常不是 PHP 本身的问题,而是字符编码不一致导致的。下面按常见原因逐一说明,并给出对应解决办法。
locale
如果看到:
LANG=zh_CN.GBK
LC_CTYPE=zh_CN.GBK
或 C、POSIX,就容易出现中文乱码。
设置为 UTF-8:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效(CentOS 7/8):
localectl set-locale LANG=zh_CN.UTF-8
或编辑:
vi /etc/locale.conf
内容:
LANG=zh_CN.UTF-8
PHP 错误日志中如果包含中文(如异常信息、业务日志),但源码文件不是 UTF-8:
file -i yourfile.php
如果不是 UTF-8,用编辑器转码:
iconv -f GBK -t UTF-8 old.php > new.php
在 php.ini 或代码中明确指定:
default_charset = "UTF-8"
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
charset utf-8;
AddDefaultCharset UTF-8
即使日志是 UTF-8,如果用:
也会乱码。
✅ 解决:
less、vim 查看less -r /var/log/php/php_errors.log
如果你用:
error_log("中文错误信息");
而 PHP 运行环境是 GBK,就会乱码。
✅ 建议:
error_log(mb_convert_encoding("中文", "UTF-8", "auto"));
| 检查项 | 命令 |
|---|---|
| 系统编码 | locale |
| 文件编码 | file -i file.php |
| PHP 编码 | `php -i |
| Web 编码 | Nginx/Apache 配置 |
| 终端编码 | 终端设置 UTF-8 |
如果你愿意,可以把:
发出来,我可以直接帮你定位是哪一种乱码。