传入非ASCII字符时json_encode返回false的原因是什么?
问题根因
PHP 内置的 json_encode() 函数要求所有输入的字符串必须为 有效的UTF-8编码,不符合编码要求的输入会直接导致函数返回false。
你示例中调用chr(128)生成的是单字节高位扩展ASCII字符,不属于合法的UTF-8编码序列,因此触发编码校验失败,函数返回布尔值false。
错误验证
你可以调用json_last_error_msg()函数查看具体错误原因,测试代码如下:
$r = json_encode(chr(128)); var_dump($r); echo json_last_error_msg(); // 输出内容为:Malformed UTF-8 characters, possibly incorrectly encoded
常见解决方案
- 先做编码转换再序列化:如果你的业务数据使用GBK、ISO-8859-1等非UTF-8编码,先通过
mb_convert_encoding()或iconv()函数将内容转换为UTF-8编码,再传入json_encode()处理。 - 使用参数忽略编码错误:PHP 7.2及以上版本可以传入
JSON_INVALID_UTF8_SUBSTITUTE参数,将无效UTF-8字符自动替换为�占位符,避免函数返回false,示例如下:$r = json_encode(chr(128), JSON_INVALID_UTF8_SUBSTITUTE); var_dump($r); // 输出结果为 string(6) ""\ufffd"" - 如果接受部分内容丢失,也可以使用
JSON_PARTIAL_OUTPUT_ON_ERROR参数,跳过编码错误的内容继续生成序列化结果,该参数兼容性更好(PHP 5.5+支持),但可能存在数据丢失风险,需谨慎使用。
内容的提问来源于stack exchange,提问作者Richi RM
相关产品推荐
相关产品推荐

