为什么json_encode会返回一个空字符串

2022-08-30 07:10:20

我有一个简单的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_encodejson_encode

编辑 :编码似乎有问题。当返回 ASCII 时,工作,但当它返回 UTF8 时,它不再工作。mb_detect_encodingjson_encode

Edit2 :返回的含义:格式错误的 UTF-8 字符,可能编码不正确json_last_error()JSON_ERROR_UTF8


答案 1

经过2个小时的挖掘(cf编辑)

我发现以下内容:

  • 在我的情况下,这是一个编码问题
  • 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));

注意:utf8_encode() 根据文档将 ISO-8859-1 字符串编码为 UTF-8,因此,如果您不确定输入编码 iconv()mb_convert_encoding() 可能是更好的选择,如注释和其他解决方案中所述。


答案 2

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() 函数。


推荐