对于包含无效(非 UTF-8)字符的字符串,有没有办法防止 json_encode()
返回 null
?
在复杂的系统中进行调试可能会很痛苦。实际看到无效字符或至少将其省略会更合适。就目前而言, json_encode()
将默默地删除整个字符串。
示例(UTF-8):
$string =
array(utf8_decode("Düsseldorf"), // Deliberately produce broken string
"Washington",
"Nairobi");
print_r(json_encode($string));
结果是
[null,"Washington","Nairobi"]
期望的结果:
["D�sseldorf","Washington","Nairobi"]
注意:我 不 希望在 json_encode() 中使用损坏的字符串。我正在寻找更容易诊断编码错误的方法。 null
字符串对此没有帮助。
原文由 Pekka 发布,翻译遵循 CC BY-SA 4.0 许可协议
php 确实会尝试发出错误,但前提是 您关闭 display_errors 。这很奇怪,因为
display_errors
设置仅用于控制是否将错误打印到标准输出,而不是是否触发错误。我想强调的是,当你打开display_errors
时,即使你可能会看到各种其他 php 错误,php 也不会只是隐藏这个错误, _它甚至不会触发它_。这意味着它不会出现在任何错误日志中,也不会调用任何自定义 error_handlers。错误永远不会发生。这里有一些代码可以证明这一点:
这种奇怪和不幸的行为与这个 bug https://bugs.php.net/bug.php?id=47494 和其他几个有关,而且看起来永远不会修复。
解决方法:
在将字符串传递给 json_encode 之前清理字符串可能是一个可行的解决方案。
http://php.net/manual/en/function.iconv.php
说明书说
因此,通过首先删除有问题的字符,理论上 json_encode() 不应该得到任何它会阻塞和失败的东西。我还没有验证带有
//IGNORE
标志的 iconv 的输出是否与 json_encodes 的有效 utf8 字符的概念完全兼容,所以买家要小心……因为可能存在它仍然失败的边缘情况。呃,我讨厌字符集问题。编辑
在 php 7.2+ 中,似乎有一些新标志
json_encode
:JSON_INVALID_UTF8_IGNORE
和JSON_INVALID_UTF8_SUBSTITUTE
目前还没有太多文档,但就目前而言,此测试应该可以帮助您了解预期的行为: https ://github.com/php/php-src/blob/master/ext/json/tests/json_encode_invalid_utf8.phpt
而且,在 php 7.3+ 中有新标志
JSON_THROW_ON_ERROR
。请参阅 http://php.net/manual/en/class.jsonexception.php