微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止json_encode删除带有无效字符的字符串

如何解决如何防止json_encode删除带有无效字符的字符串

PHP确实会尝试产生错误,但前提是 。这很奇怪,因为该display_errors设置仅用于控制是否将错误打印到标准输出,而不是控制是否触发错误。我想强调一点display_errors,即使您继续看到其他各种PHP错误PHP也不只是隐藏此错误它甚至不会触发它 。这意味着它将不会显示在任何错误日志中,也不会调用任何自定义的error_handlers。该错误永远不会发生。

这是一些演示此代码代码

error_reporting(-1);//report all errors
$invalid_utf8_char = chr(193);

ini_set('display_errors', 1);//display errors to standard output
var_dump(json_encode($invalid_utf8_char));
var_dump(error_get_last());//nothing

ini_set('display_errors', 0);//do not display errors to standard output
var_dump(json_encode($invalid_utf8_char));
var_dump(error_get_last());// json_encode(): Invalid UTF-8 sequence in argument

这种怪异和不幸的行为与该错误https://bugs.php.net/bug.php?id=47494和其他一些错误有关,并且看起来永远不会得到修复。

在将字符串传递给json_encode之前对其进行清理可能是一个可行的解决方案。

$stripped_of_invalid_utf8_chars_string = iconv('UTF-8', 'UTF-8//IGnorE', $orig_string);
if ($stripped_of_invalid_utf8_chars_string !== $orig_string) {
    // one or more chars were invalid, and so they were stripped out.
    // if you need to kNow where in the string the first stripped character was, 
    // then see http://stackoverflow.com/questions/7475437/find-first-character-that-is-different-between-two-strings
}
$json = json_encode($stripped_of_invalid_utf8_chars_string);

http://php.net/manual/zh/function.iconv.php

手册说

//IGnorE丢弃目标字符集中的非法字符。

因此,通过首先删除有问题的字符,理论上json_encode()不应该得到任何会窒息而失败的东西。我尚未验证带//IGnorE标志的iconv的输出与有效utf8字符的json_encodes概念完全兼容,因此请当心……在某些情况下它仍然会失败。恩,我讨厌字符集问题。

PHP 7.2+中进行 ,似乎有一些新的标记json_encodeJSON_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

解决方法

有没有办法json_encode()避免返回null包含无效(非UTF-8)字符的字符串?

在复杂的系统中调试可能会很麻烦。实际看到无效字符,或者至少将其省略会更合适。就目前而言,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","Nairobi"]

注意 :我
希望使破碎的字符串在json_encode()中起作用。我正在寻找简化诊断编码错误的方法。一个null字符串是不是该有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。