PHP JSON中文显示异常本质是UTF-8编码控制不到位,须同时满足:数据为合法UTF-8、json_encode启用JSON_UNESCAPED_UNICODE、响应头声明charset=utf-8,并确保PHP文件无BOM。

PHP 中 JSON 里中文显示为 \uXXXX 或问号、方块、空白,本质不是“乱码”而是编码控制不到位。核心要同时满足三件事:数据是合法 UTF-8、json_encode 不转义中文、HTTP 响应头明确声明 charset=utf-8。
确保 PHP 文件本身是 UTF-8 无 BOM
这是最容易被忽略却最致命的一环。哪怕一个控制器或配置文件开头带了 BOM(EF BB BF),就会在 json() 输出前产生不可见字符,导致 JSON 格式损坏,浏览器报 Unexpected token in JSON。
- 用 VS Code、PhpStorm 或 Notepad++ 打开所有 PHP 文件(尤其是
app/、config/、route/目录下) - 统一另存为「UTF-8 without BOM」格式
- 禁用任何前置
echo、var_dump(),也避免未定义变量触发 Notice(如$data['name']但$data不含该键)
让中文不转义:必须加 JSON_UNESCAPED_UNICODE
json_encode($data) 默认把中文转成 \u5f20\u4e09,虽不影响前端解析,但调试难、日志不可读。启用这个标志才能输出原样中文。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- PHP 5.4+ 都支持,直接写:
json_encode($data, JSON_UNESCAPED_UNICODE) - ThinkPHP 6.1+ 可在配置中全局设置:
'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(...))——双重编码会导致格式错误
强制响应头为 application/json; charset=utf-8
只靠前端发 Accept: application/json 并不能保证 TP6 返回 JSON,框架可能误走 HTML 渲染流程。
立即学习“PHP免费学习笔记(深入)”;
- 统一用
return json($data, $code),别依赖“发 JSON 请求就自动回 JSON” - 若用
response(),必须显式设头:response($data)->contentType('application/json') - Postman 或 curl 测试时,
Accept设application/json,Content-Type写application/json(不含; charset=utf-8,某些 TP6.0.x 版本会因此跳过 JSON 解析)
验证并统一数据源的 UTF-8 编码
数据库、POST 表单、外部接口传来的数据如果不是 UTF-8,json_encode() 会直接返回 false,造成空响应或 null。
- 用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5', 'ISO-8859-1'], true)检测真实编码 - 确认是 GBK 就转:
$utf8_str = mb_convert_encoding($str, 'UTF-8', 'GBK') - 确认是 ISO-8859-1 可用:
$utf8_str = utf8_encode($str) - MySQL 连接层务必执行
SET NAMES utf8mb4(不是utf8) - 调用
json_last_error_msg()查错,常见提示是Malformed UTF-8 characters


















