php输出json时中文显示为\uxxxx是默认行为,需用json_unescaped_unicode标志;同时须确保utf-8编码、正确http头及数据源字符集一致。

PHP 输出 JSON 时中文乱码?
直接 json_encode() 中文字符串会变成 \uXXXX,不是 bug,是默认行为。PHP 5.4+ 支持 JSON_UNESCAPED_UNICODE 标志,必须显式传入才能保留原生中文。
- 不加标志:
json_encode("你好")→"\u4f60\u597d" - 加标志:
json_encode("你好", JSON_UNESCAPED_UNICODE)→"你好" - 若 PHP 版本 mb_convert_encoding($str, 'UTF-8', 'GBK') 确保输入是 UTF-8,再 encode
- 输出到浏览器前,别忘了
header('Content-Type: application/json; charset=utf-8'),否则前端仍可能解析失败
var_dump() 和 print_r() 都不能代替 json_encode() 打印 JSON
它们输出的是 PHP 变量结构,不是标准 JSON 字符串。前端 JSON.parse() 会直接报错。
-
var_dump(json_encode($arr)):显示带引号和转义的字符串,但多了一层类型提示(如string(12) "{"a":1}"),不能直接用 -
echo json_encode($arr):输出干净、可被 JS 消费的 JSON - 调试时想“既看结构又看 JSON”,可用:
echo "<pre class="brush:php;toolbar:false;">" . htmlspecialchars(json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)) . "</pre>"
json_encode() 返回 false?检查数据里有没有不可序列化的成分
常见原因不是语法错,而是值本身不支持 JSON 编码,比如资源句柄、闭包、某些对象没实现 JsonSerializable 接口。
- 典型错误现象:
var_dump(json_encode($resource))→bool(false),且json_last_error_msg()返回"Type is not supported" - 排查顺序:先
var_dump(gettype($val), $val)看字段类型;重点盯resource、object、NULL(虽然 NULL 合法,但某些框架会拦截) - 安全做法:对数组做预处理,用
array_map('strval', $arr)或递归过滤掉非标量值,或用array_filter($arr, 'is_scalar') - 注意:浮点数精度问题也会触发失败(极小或极大数),可加
JSON_PARTIAL_OUTPUT_ON_ERROR(PHP 7.3+)兜底
API 接口返回 JSON,别漏掉 HTTP 状态码和 header
只 echo JSON 字符串,前端 fetch 的 response.ok 可能为 false,因为状态码还是 200 以外的默认值(比如 500 但没显式设)。
立即学习“PHP免费学习笔记(深入)”;
- 成功响应:先
http_response_code(200),再header('Content-Type: application/json; charset=utf-8'),最后echo json_encode(...) - 错误响应:比如参数错,应设
http_response_code(400),body 仍用 JSON 描述错误:["error" => "missing id"] - Apache + mod_php 下,若已输出过空白或 warning,header 会失效——务必开启
output_buffering或用ob_start()包住整个逻辑
JSON_UNESCAPED_UNICODE 加了也不顶用,得先揪出源头字符集。











