ThinkPHP前后端分离接口中文乱码的根源在于字符编码链路未统一,需逐层校准:确保PHP源文件为UTF-8无BOM、强制响应头Content-Type为application/json; charset=utf-8、数据库连接配置charset=utf8mb4、接口返回使用return json()而非echo。

ThinkPHP前后端分离接口返回中文乱码,核心原因是字符编码链路未统一——从源文件、HTTP响应头、数据库到JSON序列化环节,任一环节错用GBK、ISO-8859-1或残留BOM,都会导致前端收到乱码字节流。解决不靠“试”,而靠逐层校准。
确保PHP源文件是UTF-8无BOM格式
VS Code打开所有控制器、模型、配置文件,右下角查看编码状态:若显示“UTF-8 with BOM”或“GBK”,点击切换 → “Save with Encoding” → 选“UTF-8”(明确不勾选BOM)。Notepad++用户:编码 → 转为UTF-8无BOM格式。Linux下可用file -i App/Controller/Api.php确认输出含charset=utf-8且无with bom字样。
强制HTTP响应头声明UTF-8
前后端分离时,接口不走模板渲染,但header仍需显式设置。在路由指向的控制器方法开头(任何echo/print/json()之前)加:
header('Content-Type: application/json; charset=utf-8');- 不要写
text/html,接口类型应为application/json - 若使用中间件统一处理,可在
app/middleware.php中注册全局中间件,调用response()->header()设置
数据库连接与查询全程UTF-8
仅建库设utf8mb4不够,PHP连接时必须同步告知MySQL客户端编码:
立即学习“PHP免费学习笔记(深入)”;
- 配置文件
config/database.php中,在MySQL配置里增加:'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci' - 若手动PDO连接,DSN末尾追加
;charset=utf8mb4 - 避免在代码中执行
SET NAMES utf8(这是旧版utf8,不支持emoji;用SET NAMES utf8mb4)
JSON返回前禁用模板、显式调用json()
ThinkPHP默认可能尝试渲染HTML模板,导致输出非纯JSON:
- 路由定义不用
Route::rule('api/*', 'api/index')这类模糊匹配,改用RESTful分组:Route::group('api', function () { Route::get('user', 'api.User/read'); }); - 控制器方法末尾必须写:
return json(['code'=>0, 'msg'=>'操作成功']);(不是echo json_encode()) - 绝对禁止在控制器中调用
fetch()、display()等视图方法



















