TP6.1+可在config/app.php中配置'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES]实现全局生效,使json()、response()->json()及异常响应等自动中文不转义;TP6.0及以下版本不支持该配置,须手动传参,且需确保文件、数据库、请求全链路UTF-8编码。

TP6.1+ 直接在 config/app.php 里配 json_encode
全局生效,一劳永逸,不用每个接口都写重复参数。打开 config/app.php,找到或新增 'json_encode' 配置项:
- 必须是数组形式,不能写成字符串或单个常量
- 推荐写法:
'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES] -
JSON_UNESCAPED_UNICODE是核心,让中文不转成\u4f60\u597d -
JSON_UNESCAPED_SLASHES是加分项,避免/变成\/,更干净 - 配完后,
json()、response()->json()、异常响应、日志中json_encode()调用都会自动带上这两个标志
TP6.0 或更低版本只能手动传参
不支持 json_encode 全局配置,硬编码绕不过去。常见错误是漏掉第二个参数,或把常量写成字符串:
- 错:
json($data, 'JSON_UNESCAPED_UNICODE')—— 引号包住就失效了 - 错:
json($data)—— 默认行为,中文照旧转义 - 对:
return json($data, JSON_UNESCAPED_UNICODE) - 对(兼容性更强):
return response(json_encode($data, JSON_UNESCAPED_UNICODE))->header('Content-Type', 'application/json; charset=utf-8') - 注意:别嵌套调用,比如
json(json_encode(...)),会导致双重编码变成字符串
为什么加了标志还是显示 \uXXXX?检查这三处
加了 JSON_UNESCAPED_UNICODE 却没效果,大概率不是配置问题,而是源头已损坏:
-
PHP 文件本身带 BOM:VS Code 或 PhpStorm 打开所有控制器、路由、配置文件,确认编码是UTF-8 without BOM;一个带 BOM 的文件就会让json()前输出不可见字符,JSON 格式直接崩 -
数据库查出来就是乱码:即使 JSON 编码正确,如果$data['name']已经是寮笁这种,那最终 JSON 里还是乱码;检查数据库连接配置中'charset' => 'utf8mb4'是否写死,不能是utf8或空 -
POST/GET 参数未正确解码:前端发来的是 GBK 编码的中文,而 PHP 按 UTF-8 解,结果存进数组时就已错;确保 Nginx/Apache、浏览器、表单accept-charset全链路统一为 UTF-8
日志和调试中也要用 JSON_UNESCAPED_UNICODE
不只是响应,json_encode() 出现在任何地方都要留意这个标志,否则日志难读、调试抓瞎:
立即学习“PHP免费学习笔记(深入)”;
- dump 多层关联数据时:
echo json_encode($data->toArray(), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) - 自定义日志驱动中写入上下文:
json_encode($context, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) - 中间件里记录请求体:
json_encode($request->param(), JSON_UNESCAPED_UNICODE) - 注意:如果
$data含资源句柄、闭包、循环引用,json_encode()会静默失败或返回false,先unset()再试
JSON_UNESCAPED_UNICODE 就只是个摆设。



















