2012-02-10 68 views
2

返回null,我有这样的json_encode为UTF-8字符集

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

一个JSON文件,我保存使用UTF-8编码通过记事本++它。

然后我得到的文件内容:

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。

+0

如果文件已经在utf-8中,则不必再次对其进行重新编码。 – greut 2012-02-10 17:45:14

回答

9

我怀疑初始文件是已经在UTF-8或格式不正确的类型。

NULL或者如果编码数据大于递归限制更深返回如果JSON不能被解码。

坏编码

您可以检查您输入的内容已经通过这样有效的UTF-8

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

如果是这样,不重新编码。

的文档有更多的优惠:http://php.net/mb-check-encoding

BOM

或许记事本+ +设置一个BOM可能混淆json_decode

//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的文档。

+0

Notepad ++有一个选项可以不带BOM。现在我正在使用它。在我使用短期选项之前。这就是为什么它没有工作。谢谢。我不知道这是什么BOM。 – Fabricio 2012-02-10 18:49:23

+0

维基百科可以告诉你:https://en.wikipedia.org/wiki/Byte_order_mark – greut 2012-02-10 18:53:16

0

json_decode很好,UTF-8没有BOM。你有什么特别的理由来使用BOM?

如果您将json文件转换为不含BOM的UTF-8,则以后不需要使用utf8_encode对内容进行编码。

0

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