php 8.1 接口返回 json 中文乱码需三处统一:数据源用 utf8mb4、json_encode 加 json_unescaped_unicode、响应头声明 charset=utf-8;须检查数据库连接、表字符集、文件编码及输出前 headers 发送。

PHP 8.1 接口返回 JSON 中文乱码,核心问题不是“乱码”本身,而是编码链路断在某个环节:数据源、PHP 处理或 HTTP 响应。修复关键在于三处统一——输入是 UTF-8、json_encode 不转义、输出头声明 UTF-8。
确保数据库连接和查询用 utf8mb4
MySQL 连接层没设对,读出来的数据就不是真正的 UTF-8,后续全白搭。
- 用 mysqli:执行 mysqli_query($link, 'SET NAMES utf8mb4');(不是 utf8)
- 用 PDO:DSN 中加上 ;charset=utf8mb4,例如
mysql:host=localhost;dbname=test;charset=utf8mb4 - 确认表和字段的字符集也是 utf8mb4_unicode_ci,别只改连接不改表结构
json_encode 必须加 JSON_UNESCAPED_UNICODE
PHP 默认把中文转成 \uXXXX,看着像乱码,其实是标准行为。要让中文原样输出,必须显式启用该标志。
- 写法:json_encode($data, JSON_UNESCAPED_UNICODE)
- 别漏掉第二个参数,只写
json_encode($data)就会继续转义 - PHP 8.1 完全支持,无需额外判断版本
header 必须在任何输出前发送
即使 JSON 字符串本身正确,浏览器没收到 charset 声明,也可能按默认编码解析,显示为乱码。
- 第一行有效 PHP 代码就该是:header('Content-Type: application/json; charset=utf-8');
- 检查文件开头有没有空格、BOM 字符或 echo/print —— 一旦有,
headers already sent错误会导致 header 失效 - 不确定时,顶部加 ob_start();,后面再
ob_clean();清掉意外输出,再发 header
验证数据源头是否真为 UTF-8
如果以上都做了还出 null 或乱码,大概率是某处混入了非 UTF-8 字符(比如 GBK 编码的旧数据、带 BOM 的文本文件)。
- 用 mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true) 检查字符串实际编码
- 确认非 UTF-8 后,用 mb_convert_encoding($str, 'UTF-8', 'GBK') 转换(别盲目用 utf8_encode)
- 调用 json_encode 前加判断:
if (json_last_error() !== JSON_ERROR_NONE) { error_log(json_last_error_msg()); }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











