必须设置header('content-type: application/json; charset=utf-8'),确保数据源为utf-8编码,并在json_encode()中使用json_unescaped_unicode参数,同时php文件须保存为utf-8无bom格式。

PHP接口返回JSON时中文乱码怎么处理
直接用 json_encode() 输出中文,浏览器看到的是 Unicode 转义(如 "\u4f60\u597d")或乱码,本质是没告诉客户端字符编码。PHP 默认不自动加 Content-Type: application/json; charset=utf-8 头,浏览器就按 ISO-8859-1 解析。
实操建议:
- 必须手动输出 UTF-8 响应头:
header('Content-Type: application/json; charset=utf-8'); - 确保数据源本身是 UTF-8 编码(比如 MySQL 连接要设
charset=utf8mb4,文件保存为 UTF-8 无 BOM) -
json_encode()加上JSON_UNESCAPED_UNICODE参数,避免中文被转成\uXXXX:$data = ['msg' => '你好'];<br>header('Content-Type: application/json; charset=utf-8');<br>echo json_encode($data, JSON_UNESCAPED_UNICODE);
遇到空数组/空对象返回 null 怎么办
json_encode(null) 或对未定义变量、空对象调用 json_encode() 会返回 null 字符串,前端解析失败。这不是编码问题,是 PHP 数据状态没兜住。
常见错误现象:接口返回纯文本 null,而不是 {"data":null} 这类合法 JSON。
实操建议:
- 不要直接
echo json_encode($var),先判断变量是否可 JSON 序列化:is_array($var) || is_object($var) || is_scalar($var) - 空值统一兜底为数组:
$data = $data ?? []; - 如果业务允许,用
JSON_THROW_ON_ERROR捕获异常,避免静默失败:try {<br> echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);<br>} catch (JsonException $e) {<br> http_response_code(500);<br> echo json_encode(['error' => 'JSON encode failed'], JSON_UNESCAPED_UNICODE);<br>}
需要 Base64 编码传输敏感字段怎么办
JSON 本身是明文,有些场景(比如临时 token、简单混淆)要求对某个字段做 Base64 编码,不是整个响应体编码——整个响应体 Base64 是反模式,前端还得多解一层,还破坏可读性和调试性。
实操建议:
- 只对具体字段操作,例如用户手机号:
$data['phone_encoded'] = base64_encode($user['phone']); - 注意 Base64 编码后可能含
+、/、=,若用于 URL 参数需额外 URL-safe 处理(用strtr()替换) - 别把 Base64 当加密用,它可逆且无密钥;真要加密用
sodium_crypto_secretbox()或 OpenSSL
为什么用了 utf-8 头还是有乱码
最常忽略的是 PHP 文件自身编码。哪怕写了 header('charset=utf-8'),如果 PHP 源文件存成了 GBK,里面写的中文字符串在解析时就已损坏,json_encode() 只是对坏数据做编码,结果必然错。
检查顺序必须是:
- 编辑器确认 PHP 文件保存为 UTF-8 无 BOM(VS Code 右下角看,Sublime 用 “Save with Encoding → UTF-8”)
- MySQL 连接层设置正确:
mysqli_set_charset($conn, 'utf8mb4')或 PDO DSN 加;charset=utf8mb4 - Web 服务器(Nginx/Apache)没强制覆盖
charset响应头
这三个环节漏掉任意一个,单靠 json_encode() 参数和 header 都救不回来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











