2012-02-10 66 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字符串,因此將其打斷。