PHP乱码须分四层处理:PHP文件编码(UTF-8无BOM)、HTTP响应头(header('Content-Type: text/html; charset=utf-8'))、HTML meta(<meta charset="utf-8">)、MySQL连接编码(utf8mb4),缺一不可。

phpEnv 本身不提供“站点编码”配置项,所谓“修改站点编码”是误解;乱码问题必须拆解到 PHP 文件编码、HTTP 响应头、HTML meta、MySQL 连接层这四层分别处理,缺一不可。
确认 PHP 文件是 UTF-8 无 BOM(不是 phpEnv 设置的)
phpEnv 只是本地环境套件,它不干预你写的 PHP 文件怎么存。很多乱码根源就在编辑器里——文件被存成了 GBK 或 UTF-8 with BOM。
- 用 VS Code 打开 PHP 文件,右下角点编码显示(如 “UTF-8 with BOM”),选“通过编码重新打开”→“UTF-8”,再点一次选“另存为编码”→“UTF-8”并确保勾选“无 BOM”
- Linux 下快速检查:
file -i index.php,输出含charset=utf-8且无bom字样才算对 - 若已有 BOM,可批量清除:
sed -i '1s/^\xEF\xBB\xBF//' *.php
PHP 脚本开头必须加 header('Content-Type: text/html; charset=utf-8')
这个 header 不是 phpEnv 配的,是你自己 PHP 文件里写的。它必须在任何输出前执行,否则会触发 headers already sent 错误。
- 检查
<?php前有没有空格、换行或 UTF-8 BOM —— 有就失效 - 别写成
header('Content-Type: text/html; charset=gbk'),哪怕页面全是中文也不行 - 用
curl -I http://localhost/test.php看响应头是否真包含charset=utf-8
MySQL 连接必须显式设 utf8mb4(不是改 phpEnv 的 my.ini)
phpEnv 自带的 MySQL 默认字符集通常是 latin1,连上库不手动切编码,读中文就是乱码,哪怕表结构全是 utf8mb4。
立即学习“PHP免费学习笔记(深入)”;
- mysqli 连接后立刻执行:
$mysqli->set_charset('utf8mb4')(不是query("SET NAMES utf8")) - PDO DSN 中必须带参数:
mysql:host=localhost;dbname=test;charset=utf8mb4 - 验证是否生效:
var_dump($mysqli->character_set_name())应返回utf8mb4
HTML 中 必须放在 最前面
这是浏览器的 fallback 编码声明,和 header 同步才稳。只靠 header 在某些 CDN 或代理环境下可能被覆盖。
- 写成
<meta charset="UTF-8">,别用小写utf-8(旧版 IE 有兼容问题) - 该标签必须是
内第一个子元素,不能在<title></title>或外部 CSS 之后 - 如果用了模板引擎(如 ThinkPHP 的
{include file="xxx"}),确认它没在你之前输出空白
最容易被忽略的是:PHP 文件编码错了,header 和 meta 写得再标准也没用;或者数据库连上了但没调 set_charset,phpMyAdmin 看着正常,PHP 里 echo 出来全是问号。这两处不查,其他全白调。



















