You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中的空白字符为何会破坏PHP生成的JSON?

解决WordPress MySQL内容转JSON时解析为null的问题

我之前也踩过一模一样的坑!这种情况百分百是post_content里藏着JSON不兼容的特殊字符——比如不可见的控制字符、非标准空白(像不间断空格、全角空格),或是没正确处理的HTML实体、特殊公式符号,这些都会直接让JSON解析器罢工返回null。

下面是我亲测有效的解决步骤,一步步来就能搞定:

1. 先清理控制字符和无效空白

WordPress编辑器存到MySQL的内容里,经常会混入ASCII控制字符(比如\0、\x0B这类),还有从别处复制过来的奇怪空白。用正则把这些彻底干掉:

function clean_special_chars($content) {
    // 移除所有ASCII控制字符(保留换行、回车、制表符)
    $content = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $content);
    // 把各种非标准空白替换成普通空格
    $content = preg_replace('/[\x{00A0}\x{200B}\x{200C}\x{200D}\x{2060}\x{FEFF}]/u', ' ', $content);
    return trim($content);
}

2. 强制确保内容是UTF-8编码

JSON严格要求UTF-8编码,要是数据库里的内容编码跑偏(比如GBK),转JSON肯定出问题。直接强制转码:

$clean_content = mb_convert_encoding($clean_content, 'UTF-8', 'auto');

3. 处理HTML实体和特殊公式符号

你提到的带样式的<p>标签本身没问题,但如果里面有未转义的引号、或是特殊公式符号(比如∑、∞这类),可以先把HTML实体转成原生字符,再交给json_encode自动处理:

// 把HTML实体转成普通字符(包括引号)
$clean_content = htmlspecialchars_decode($clean_content, ENT_QUOTES);
// 要是公式是用短代码存的,可能需要先解析;如果是原生符号,这步就足够了

4. 生成JSON并排查错误

最后生成JSON时,记得加JSON_UNESCAPED_UNICODE参数避免中文转义,同时一定要检查生成是否出错:

$json_data = json_encode(['content' => $clean_content], JSON_UNESCAPED_UNICODE);
// 检查JSON生成是否有错误
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'JSON生成错误: ' . json_last_error_msg();
    exit;
}
// 写入文件
file_put_contents('output.json', $json_data);

额外排查小技巧

要是还是有问题,可以把清理后的$clean_content输出到控制台,用mb_detect_encoding()检查编码,或是用bin2hex()查看有没有奇怪的十六进制字符——比如00(空字符)、0B(垂直制表符)这些都是JSON的“天敌”。

内容的提问来源于stack exchange,提问作者Rooz Far

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:42:11