在 Ubuntu 上用 Apache 出现乱码,通常不是 Apache 本身坏了,而是编码设置不一致。下面按最常见原因给你排查:
检查你的 HTML / PHP 文件:
file -i index.html
如果看到:
charset=iso-8859-1
说明文件不是 UTF-8。
✅ 解决:
iconv -f GBK -t UTF-8 index.html > index.utf8.html
mv index.utf8.html index.html
(如果是 Windows 写的文件,常是 GBK)
在 <head> 里必须有:
<meta charset="UTF-8">
老写法也可以:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
⚠️ 没这一行,浏览器会“猜编码”,很容易乱码。
Apache 可能发了:
Content-Type: text/html; charset=ISO-8859-1
grep -R "AddDefaultCharset" /etc/apache2/
如果看到:
AddDefaultCharset ISO-8859-1
✅ 改成:
AddDefaultCharset UTF-8
然后重启:
sudo systemctl restart apache2
在 PHP 文件最前面加:
header("Content-Type: text/html; charset=UTF-8");
并且确保 PHP 文件本身是 UTF-8(无 BOM)。
如果是从数据库读出来乱码:
mysqli_set_charset($conn, "utf8mb4");
utf8mb4
✔ 文件是 UTF-8
✔ HTML 有 charset=UTF-8
✔ Apache 是 AddDefaultCharset UTF-8
✔ PHP header 正确
✔ 数据库是 utf8mb4
如果你愿意,可以把下面信息发我,我可以直接帮你定位:
curl -I 你的网址 的输出我可以直接告诉你改哪一行。