thinkphp json 中文转义需关闭:tp6.1+ 全局配置 json_encode => json_unescaped_unicode | json_unescaped_slashes;tp6.0 及更早需手动 json_encode() 并设响应头;重定义 json() 函数更可控;务必确保数据源为 utf-8。

ThinkPHP 的 json() 默认把中文转成 \uXXXX,不是 bug,是 PHP 原生行为;但接口返回一堆 Unicode 转义,前端调试、日志排查都费劲,必须关掉。
ThinkPHP 6.1+ 全局配置 JSON_UNESCAPED_UNICODE
这是最省事、一劳永逸的方式,所有 json()、response()->json() 和框架自动 JSON 化(比如异常响应)都会生效。
- 打开
config/app.php,添加或修改'json_encode' => []配置项 - 值设为
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,斜杠也不转义,更干净 - TP6.0 及更早版本不支持该配置,别硬套,会无效
手动调用 json_encode() 替代 json() 助手函数
适合临时修复单个接口、或 TP6.0 项目,但要注意响应头和类型处理。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 别写
return json(json_encode($data, ...))—— 二次编码直接乱码 - 必须显式设置响应头:
header('Content-Type: application/json; charset=utf-8'),否则可能被当text/html -
json_encode()返回字符串,不是 Response 对象,不能链式调用->header()等方法 - 示例写法:
return response(json_encode($data, JSON_UNESCAPED_UNICODE))->header('Content-Type', 'application/json; charset=utf-8');
重定义 json() 辅助函数(TP6/7 推荐)
比全局配置更底层、更可控,所有地方调用 json($data) 都自动带上不转义选项,无需改业务代码。
- 在
app/common.php或app/bootstrap.php(TP7)中重写json()函数 - 核心是覆盖
think\facade\Json::create(),默认传入JSON_UNESCAPED_UNICODE - 如果还要加缩进,用按位或:
$options | JSON_PRETTY_PRINT - TP5.1 不支持重定义助手函数,这条路走不通
为什么 response()->json() 有时不转义,但别乱用
它确实默认不转义中文,但和 json() 助手函数职责完全不同,混用容易出问题。
-
response()->json()是响应专用,自动设头、结束请求,适合 API 直接返回 -
json()是纯编码工具,返回字符串,常用于日志、缓存、拼字段等非响应场景 - 在中间件或循环逻辑里误用
response()->json(),会导致请求提前终止 - 它的第二个参数是 HTTP 状态码,不是
json_encode()的选项,传错会静默失效
真正卡住人的往往不是怎么开 JSON_UNESCAPED_UNICODE,而是数据源本身不是 UTF-8 —— 比如 MySQL 连接没设 utf8mb4、文件读出来是 GBK、POST 数据没转码。这时候加了标志也没用,json_encode() 会直接返回 false 或输出空字符串。先用 mb_detect_encoding() 确认编码,再用 mb_convert_encoding() 转,比反复调参数更治本。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










