在 CentOS + LAMP(Linux + Apache + MySQL + PHP) 环境中出现乱码,通常不是单一原因,而是 字符集(编码)在多个环节不一致 造成的。下面按常见原因 → 排查位置 → 解决方法给你系统梳理一下。
乱码本质是:
数据写入时编码 ≠ 数据读取时编码 ≠ 页面展示编码
常见环节:
✅ 推荐:UTF-8 无 BOM
❌ 错误示例:
解决:
file -i index.php
应为:
index.php: text/x-php; charset=utf-8
编辑工具(vim / VS Code)统一保存为 UTF-8 无 BOM
grep -R "AddDefaultCharset" /etc/httpd/
在 Apache 配置或 .htaccess 中加:
AddDefaultCharset UTF-8
或虚拟主机中:
<VirtualHost *:80>
DocumentRoot /var/www/html
AddDefaultCharset UTF-8
</VirtualHost>
重启:
systemctl restart httpd
header("Content-Type:text/html; charset=utf-8");
default_charset = "UTF-8"
SHOW VARIABLES LIKE 'character_set%';
常见错误:
character_set_server = latin1
编辑:
vi /etc/my.cnf
添加:
[client]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
重启:
systemctl restart mysqld
ALTER DATABASE dbname CHARACTER SET utf8mb4;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4;
$mysqli->set_charset("utf8mb4");
new PDO(
"mysql:host=localhost;dbname=test;charset=utf8mb4",
$user, $pass
);
❌ 错误:
mysql_query("SET NAMES utf8"); // 老写法不稳定
确保:
charset=utf-8<meta charset="utf-8">
| 检查项 | 正确值 |
|---|---|
| PHP 文件 | UTF-8 无 BOM |
| Apache | UTF-8 |
| PHP header | utf-8 |
| MySQL server | utf8mb4 |
| DB / Table | utf8mb4 |
| 连接 | utf8mb4 |
| 浏览器 | UTF-8 |
你可以补充:
我可以直接帮你定位是哪一层出的问题。