应启用json_unescaped_unicode选项并确保输入为utf-8编码,统一源数据、脚本文件及http响应头的utf-8设置,配合mb_convert_encoding强制归一化和json_last_error精准排错。

PHP 7.4 和 7.3 的 json_encode 中文输出行为一致
只要 PHP 版本 ≥ 5.4,JSON_UNESCAPED_UNICODE 的行为就没有变化。7.3 和 7.4 在这个 flag 上完全兼容——加了就输出原样中文,不加就转成 \u4f60\u597d 这类 Unicode 序列。所谓“差异”通常来自误判:比如开发环境用的是 7.4,测试环境却是 7.2(没开 flag 就返回 null),或前端没设 Content-Type: application/json; charset=utf-8 导致浏览器乱解码。
json_encode 返回 null 的真实原因(不是版本问题)
遇到中文导致 json_encode 返回 null,几乎全是编码污染,和 PHP 小版本无关:
- 数据库连接未设
utf8mb4,查出的字段含 GBK 字节 - 从文件读取时没指定编码,
fgets()读入了 BOM 或混合编码字符串 - 表单 POST 数据未经
mb_convert_encoding($str, 'UTF-8', 'auto')清洗 - 数组里混入了
resource(如未关闭的mysqli句柄)或递归引用对象
验证方式很简单:var_dump(json_last_error_msg()) —— 出现 "Malformed UTF-8 characters, possibly incorrectly encoded" 就是编码问题;出现 "Type is not supported" 就是数据类型非法。
推荐的生产级 json_encode 调用写法
不要只依赖 JSON_UNESCAPED_UNICODE,组合使用几个关键 flag 才算稳妥:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
-
JSON_UNESCAPED_UNICODE:保留中文可读性 -
JSON_UNESCAPED_SLASHES:避免\/转义,防止被 HTML 解析器截断 -
JSON_INVALID_UTF8_SUBSTITUTE(PHP 7.2+):把非法 UTF-8 字节替换成,而不是让整个编码失败返回null - 线上环境**禁用**
JSON_PRETTY_PRINT:它只增加空格换行,无业务价值,还增大传输体积
示例:
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE);若仍返回
false,说明数据本身有硬伤,得回溯清洗源头,而不是调参。最容易被忽略的隐性坑:字符串里的不可见控制字符
你看到 JSON 输出里某条标题是 "PHP\nTutorial",不是 json_encode 加的换行,而是原始字符串里真有 \n 或 \r。这类字符在 var_dump 里不显眼,但会破坏 JSON 结构有效性(尤其当值嵌在 HTML 属性中时)。解决方法不是改 flag,而是预处理:
- 用
str_replace(["\r", "\n", "\t"], ' ', $str)简单替换 - 对用户输入字段用
trim(preg_replace('/\s+/', ' ', $str))压缩空白 - 富文本内容必须走
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')再进 JSON(如果最终要插进 HTML)
flag 再全也救不了带脏数据的数组——json_encode 是编码器,不是清洗器。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










