为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
米脂 2019-08-02 15:38:03
为什么json_encode会返回一个空字符串我有一个简单的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,它不工作了。Edit2:json_last_error()返回JSON_ERROR_UTF8表示:格式错误的UTF-8字符,可能编码错误。
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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

我发现了以下内容:

  • 在我的情况下,这是一个编码问题

  • 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()可能是更好的选项,如注释和其他解决方案中所述。


查看完整回答
反对 回复 2019-08-02
?
繁花如伊

TA贡献2012条经验 获得超12个赞

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


查看完整回答
反对 回复 2019-08-02
?
浮云间

TA贡献1829条经验 获得超4个赞

对我来说,这个问题的答案是在我的PDO连接中设置charset = utf8。

例如:$dbo = new PDO('mysql:host=localhost;dbname=yourdb;charset=utf8', $username, $password);


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 883 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信