为什么json_encode会返回空字符串?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我有一个简单的PHP结构3嵌套数组。

我不使用特定的对象,而是使用2个嵌套循环构建自己的数组。

这里是我想要转换为Json的数组的var_dump的示例。

array (size=2)
  'tram B' => 
    array (size=2)
      0 => 
        array (size=3)
          'name' => string 'Ile Verte' (length=9)
          'distance' => int 298
          'stationID' => int 762
      1 => 
        array (size=3)
          'name' => string 'La Tronche Hôpital' (length=18)
          'distance' => int 425
          'stationID' => int 771
  16 => 
    array (size=4)
      0 => 
        array (size=3)
          'name' => string 'Bastille' (length=8)
          'distance' => int 531
          'stationID' => int 397
      1 => 
        array (size=3)
          'name' => string 'Xavier Jouvin' (length=13)
          'distance' => int 589
          'stationID' => int 438

在另一个脚本中,我有一个类似的结构,json_encode工作正常。所以我不明白为什么json_encode不在这里工作。

编码似乎有问题。当mb_detect_encoding返回ASCII,这些json_encode作品,但当它返回UTF8时,它不再工作。

json_last_error()返回JSON_ERROR_UTF8这意味着:格式错误的UTF-8字符,可能错误地编码

提问于
用户回答回答于

我发现如下:

  • 在我的情况下,这是一个编码问题
  • mb_detect_encoding 返回可能是错误的响应,有些字符串可能不是UTF-8
  • 使用utf8_encode()这些字符串解决了我的问题。

这是一个递归函数,可以强制转换为UTF-8数组中包含的所有字符串:

function utf8ize($d) {
    if (is_array($d)) {
        foreach ($d as $k => $v) {
            $d[$k] = utf8ize($v);
        }
    } else if (is_string ($d)) {
        return utf8_encode($d);
    }
    return $d;
}

使用它就像这样:

echo json_encode(utf8ize($data));
用户回答回答于

Matthieu Riegler提出了非常好的解决方案,但是我必须稍微修改它以处理对象:

function utf8ize($d) {
    if (is_array($d)) 
        foreach ($d as $k => $v) 
            $d[$k] = utf8ize($v);

     else if(is_object($d))
        foreach ($d as $k => $v) 
            $d->$k = utf8ize($v);

     else 
        return utf8_encode($d);

    return $d;
}

还有一点需要注意:json_last_error()可能有助于调试json_encode()/ json_encode()函数。

扫码关注云+社区