当前位置:首页 > PHP教程 > php应用 > 列表

PHP JSON 输出怎么保留中文

发布:smiling 来源: PHP粉丝网  添加日期:2026-09-21 11:47:54 浏览: 评论:0 

使用 json_encode($data, JSON_UNESCAPED_UNICODE) 可避免中文转为\uXXXX,需确保PHP≥5.4、响应头设为Content-Type: application/json; charset=utf-8、数据源为UTF-8编码,并统一处理嵌套内容。

PHP json_encode() 中文变成 Unicode 转义怎么办

默认情况下,json_encode() 会把中文字符转成 \uXXXX 形式,比如 "姓名" 变成 "\u59d3\u540d"。这不是 bug,是它的默认行为——它只保证 JSON 合法,不保证可读性。

解决方法很简单:加 JSON_UNESCAPED_UNICODE 标志位。

json_encode($data, JSON_UNESCAPED_UNICODE) 是最直接有效的写法

如果还要兼容空数组/对象输出为 {} 或 [](而非 null),可以叠加 JSON_UNESCAPED_SLASHES 等其他标志

注意:PHP 版本必须 ≥ 5.4.0,老版本不支持该常量,需升级或改用 iconv() + 正则等绕路方案(不推荐)

输出前没设 Content-Type 导致浏览器乱码

即使 JSON 字符串里中文正常了,浏览器仍可能显示方块或问号——大概率是 HTTP 响应头缺失或错误。

务必在 echo 前加:

header('Content-Type: application/json; charset=utf-8');

不能只写 charset=utf8(少了个短横,部分浏览器不认)

不能依赖 HTML meta 标签,JSON 不走 HTML 渲染流程

如果用 Nginx/Apache 做了全局字符集配置,也要确认没被覆盖(例如 PHP-FPM 的 default_charset 设为 "" 才不会干扰)

数据源本身编码不是 UTF-8 会白忙活

json_encode() 只处理已加载到内存的字符串,它不会自动转码。如果从数据库、文件或 POST 请求拿到的是 GBK、BIG5 或 ISO-8859-1 编码的中文,直接传进去会出错或截断。

MySQL 查询前先执行 SET NAMES utf8mb4(或用 PDO 设置 PDO::MYSQL_ATTR_INIT_COMMAND)

读文件时用 file_get_contents() + mb_convert_encoding($content, 'UTF-8', 'GBK') 显式转码

接收 $_POST 数据前,检查 mb_detect_encoding($_POST['text']),必要时统一转 UTF-8

API 返回结构复杂时,别漏掉嵌套字段

有时只对顶层数组调用了 json_encode(),但里面某个值是通过 file_get_contents() 读取的 JSON 字符串,或从第三方接口拼接进来的——这些子内容若含未转义的中文,最终结果仍可能混着 \uXXXX。

避免手动拼接 JSON 字符串,一律用 json_encode() 处理最终完整数组

如果必须合并已有 JSON 字符串,先 json_decode($str, true) 再合并,最后统一 json_encode(..., JSON_UNESCAPED_UNICODE)

调试时用 var_dump(json_last_error_msg()) 检查是否因编码问题导致编码失败(返回空字符串且无报错是常见陷阱)

实际最难缠的往往不是函数怎么调,而是中文在进入 PHP 内存前就已损坏——比如 MySQL 连接层没设对、Nginx 把请求体悄悄转码了、甚至前端发请求时 header 里声明了错误的 Content-Type。留心数据流每个环节的编码状态,比死磕 json_encode() 参数更关键。

Tags: PHP JSON 输出怎么保留中文

分享到: