json_encode为UTF-8字符集返回null

时间:2012-02-10 17:30:44

标签: php json

我有一个像这样的json文件

{"downloads":[
    {
        "url":"arquivo1.pdf",
        "descricao":"árquivo 1"
    },
    {
        "url":"arquivo2.pdf",
        "descricao":"arquivo 2"
    }
]}

我使用 UTF-8编码通过 Notepad ++ 保存。

然后我得到文件内容:

function getContent($name)
{
    $content = file_get_contents("configs/" . $name . ".json");
    $encoded = utf8_encode($content);
    return json_decode($encoded);
}

json_decode返回null

如果我将json文件保存为ANSI,那么它可以工作。但是我想把它保存为UTF-8。

3 个答案:

答案 0 :(得分:10)

我怀疑初始文件已经是UTF-8或格式错误。

  如果无法解码json或编码数据深于递归限制,则返回

NULL

编码错误

您可以通过执行以下操作检查输入内容是否已经有效utf-8:

$is_valid_utf8 = mb_check_encoding($content, 'utf-8'));

如果是,请不要重新编码。

该文档提供了更多内容:http://php.net/mb-check-encoding

<强> BOM

或者Notepad ++可能会设置一个可能会混淆json_decode的BOM。

//Remove UTF-8 BOM if present, json_decode() does not like it.
if(substr($content, 0, 3) == pack("CCC", 0xEF, 0xBB, 0xBF)) {
    $content = substr($content, 3);
}

请参阅json_decode的文档。

答案 1 :(得分:0)

json_decode适用于没有BOM的UTF-8。你有什么特别的理由使用BOM吗?

如果您将json文件转换为没有BOM的UTF-8,则无需稍后使用utf8_encode对内容进行编码。

答案 2 :(得分:0)

它不起作用,因为您的文件已经在UT8中,并且当您使用utf8_encode()再次对其进行编码时,PHP假定您的字符串是ISO-8859-1字符串,因此会破坏它。