当前位置: 首页 > 面试题库 >

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

秦景同
2023-03-14
问题内容

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

我不使用特定的对象,而是使用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字符,可能编码不正确。


问题答案:

经过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()可能是更好的选择。



 类似资料:
  • 问题内容: 这可能是最简单的事情之一,但我看不到自己在做错什么。 我的输入包括一个带有数字的第一行(要读取的行数),一串包含数据的行和最后一行仅包含\ n的行。我应该处理此输入,并在最后一行之后做一些工作。 我有这个输入: 对于读取输入,我有以下代码。 我的问题是为什么我什么都不打印?程序读取第一行,然后不执行任何操作。 问题答案: 不读取以下换行符,因此第一个(返回 当前 行的其余部分 )将始终

  • 问题内容: 为什么要得到一个空字符串?我的代码是: 此代码警报,但我想得到,我怎么了?谁能帮我? 更新 我更改了CSS函数,现在可以正常使用了: 问题答案: 该属性用于获取直接放置在元素上的样式。它不会从样式表中计算样式。

  • 为什么返回而不是像或这样的较小类型?我的理解是,这个方法只返回-1、0或1。 第二部分,如果我要设计一个比较方法来比较两个类型的对象,并且我只想返回-1、0或1,那么使用或通常是个好主意吗? 编辑:我已经更正,不返回-1,0或1,它实际上返回一个值 答案似乎大致是,没有理由返回小于的类型,因为返回值是右值,而这些右值不会受益于小于int类型(4字节)。此外,许多人指出,大多数系统的寄存器可能会有大

  • 我试图将mysql查询的结果作为json返回,但是json_encode函数总是返回空白,尽管数组包含元素。 检索查询并转换为php数组: 然后返回结果: 这不返回任何内容,而我在回显以下语句时确实得到了结果: 返回“数组” 返回“Youreka!demo” 你知道我做错了什么吗? ID:2,名字:尤瑞卡!演示,地址:Italiëlei 26,邮政编码:2000,城市:Antwerpen,国家:B

  • 问题内容: 我有限的大脑无法理解为什么会这样: 在PHP中,等效比较返回false: 问题答案: 从文档中: 对于Unicode和字符串类型,当且仅当 x 是 y 的子字符串时,才为true 。等效测试为。注意, x 和 y 不必是同一类型;因此,将返回。 空字符串始终被视为任何其他字符串的子字符串,因此将返回。 通过查看呼叫,您正在使用2.x。 要更深入,请看一下字节码: 是我们进行布尔运算并查

  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在