json_encode()将非UTF8字符串转换为null,但在实时站点上返回false

时间:2014-07-10 09:49:50

标签: php utf-8 null json

在我必须用于项目(Lithium)的框架中,特定页面上的输出通过json_encode()。在本地和现场我尝试使用同一个数据,结果是:

  1. 在本地返回JSON,但有些值会转换为null
  2. 直播网站 - 返回false
  3. 在我运行json_last_error()的两种情况下 - 它都会给我int(5)。如果某些设置导致问题,我可以在这两个地方运行phpinfo()。 (本地我用PHP 5.3。*,现场直播5.5.9。)

3 个答案:

答案 0 :(得分:1)

实际上,在UTF8字符的情况下,你需要使用json_encode的可选参数

所以你可以使用

<强> JSON_UNESCAPED_UNICODE  的选择     JSON_ENCODE

示例:

json_encode($array, JSON_UNESCAPED_UNICODE)

答案 1 :(得分:1)

访问php documentation here

虽然此处的版本日志中没有记录这一点,但5.5中的非UTF8处理行为已经发生变化,这会使调试变得困难。

将非UTF-8字符串传递给json_encode()将使该函数在PHP 5.5中返回false,而在以前的版本中它只会使该字符串(并且只有这一个)无效。

在Latin-1编码文件中,写下:

$a = array('é', 1);
var_dump(json_encode($a));

PHP&lt; 5.4:string(8) "[null,1]"

PHP&gt; = 5.5:bool(false)

PHP 5.5当然是正确的(如果编码失败,返回false)但是在更新到5.5时它可能会引入错误,因为以前你可以得到其余的JSON,即使一个字符串不是UTF8(如果这个字符串没用过,你永远不会通知它已经无效了)

答案 2 :(得分:0)

最后 - 我使用了这个要点的略微修改版本 - http://gist.github.com/oscar-broman/3653399 - 但不是编码属性 - 我正在删除所有非UTF8字符串......它正在工作。但是 - 我不得不修改网站正在使用的PHP框架......这是我真正想要避免的...... ......但无论如何,这种方法现在可以完成这项工作:) ......