ThinkPHP 6.0 中文乱码需全链路排查:确保PHP文件UTF-8无BOM、JSON响应头正确、数据库charset=utf8mb4、Excel导出设宋体、禁用FilterValue中间件并配合HtmlPurifier过滤富文本。

ThinkPHP 6.0 中文乱码不是单一配置能解决的问题,而是涉及文件编码、JSON 序列化、HTTP 响应头、数据库连接、字体设置等多个环节。常见表现包括接口返回 \u5f20\u4e09(其实是正常转义,非真乱码)、浏览器显示问号或方块、Excel 导出中文变空格、富文本存取后 HTML 标签被转义等。关键在于分场景定位源头,再针对性处理。
确保所有 PHP 文件为 UTF-8 无 BOM
这是最隐蔽也最致命的一环。只要任意一个控制器、配置或路由文件带 BOM(EF BB BF),就会在 json() 输出前产生不可见字符,导致 JSON 格式损坏,前端报错 Unexpected token in JSON。
- 用 VS Code 或 PhpStorm 打开
app/、config/、route/下所有 PHP 文件,右下角检查编码,手动转为「UTF-8 without BOM」 - 禁用调试中所有
echo、var_dump(),避免 Notice 触发额外输出 - 检查
runtime/目录是否可写——若不可写,框架可能把错误信息直接打到响应体开头
接口返回 JSON 中文不转义且正确解析
TP6 默认用 json_encode() 将中文转成 \uXXXX,这本身合法,但影响可读性;真正出问题的是响应头缺失或错配。
- TP6.1+:在
config/app.php中添加'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES] - TP6.0:控制器中改用
return response(json_encode($data, JSON_UNESCAPED_UNICODE))->header('Content-Type', 'application/json; charset=utf-8'); - 务必只调用一次序列化,避免
json(json_encode(...))导致双重编码 - Postman 测试时,必须带上
Accept: application/json请求头,否则 TP6 可能走 HTML 渲染流程
数据库与 Excel 导出中的中文支持
乱码常出现在数据入库/导出环节,根源是字符集未对齐。
立即学习“PHP免费学习笔记(深入)”;
- MySQL 连接需显式指定
charset=utf8mb4,在config/database.php的dsn或params中加入 - 建表语句确保字段为
LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,尤其富文本字段 - Excel 导出用 PhpSpreadsheet 时,必须设默认字体为
SimSun(宋体),不能用微软雅黑或黑体;日期字段要先设数值类型再套格式码,否则显示为数字
富文本与模板渲染防二次转义
TP6 默认启用 FilterValue 中间件,会对所有请求参数执行 htmlspecialchars(),导致富文本内容一入库就变成 <p></p>,渲染时只显示源码。
- 打开
app/middleware.php,注释掉think\middleware\FilterValue::class - 前端编辑器(如 wangEditor)提交前,必须调用
editor.txt.html()获取原始 HTML,并赋值给隐藏域传参 - 模板中输出富文本时用
{$content|raw},但前提是入库前已用HtmlPurifier做白名单过滤,不可跳过清洗步骤



















