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
相关产品推荐
相关产品推荐

