2011-03-22 56 views
1

這已經讓我徹底難倒了:json_encode問題

print_r($json); 
echo json_encode($json); 

輸出:

Array 
(
    [query] => dia 
    [suggestions] => Array 
     (
      [0] => Diana Johnson 
      [1] => Diane Abbott 
     ) 

) 
{"query":"dia","suggestions":[null,null]} 

這到底是哪裏錯了?

編輯只需添加到這個一般WTF-ERY,這裏的另一個示例:

Array 
(
    [query] => david 
    [suggestions] => Array 
     (
      [0] => David Cameron 
      [1] => David Amess 
      [2] => David Anderson 
      [3] => David Blunkett 
      [4] => David Burrowes 
     ) 

) 
{"query":"david","suggestions":["David Cameron",null,null,null,null]} 
+0

您是否100%肯定'$ json'中的所有內容都是有效的UTF-8? – Jon 2011-03-22 22:58:43

+0

這一切都是從同一個數據庫的同一張表中拖出來的。有沒有理由不這樣做? – fredley 2011-03-22 23:00:01

回答

2

這看起來像一個自動完成腳本。我假設你的結果是從數據庫加載的,你確定它們是utf-8嗎?如果你不能通過硬編碼數組來複制這個功能,那麼這可能是一個編碼問題。

根據http://php.net/manual/en/function.json-encode.php,「此函數僅適用於UTF-8編碼數據。」

您還可以使用http://php.net/manual/en/function.json-last-error.php來查看最後一個錯誤。

+0

我只在5.2上沒有'json_last_error'。如果數據不是UTF-8(表格中的排序規則是UTF-8),那麼我該如何轉換它? – fredley 2011-03-22 23:03:05

+0

mysql_query('SET CHARACTER SET utf8') – Peeter 2011-03-22 23:04:16

+0

通過檢查字節,我們可以很快得知它是否是UTF8。 echo'rawurlencode($ json ['suggestions'] [0]);'?'的輸出是什麼? – Charles 2011-03-22 23:05:13

2

我發佈此作爲答案,因爲我需要正常答案框的完整格式化能力。

是的,這是UTF-8好的。從PHP交互提示:

php > $david = urldecode('David%A0Amess'); 
php > echo json_encode($david); 
null 
php > $david = urldecode('David%20Amess'); 
php > echo json_encode($david); 
"David Amess" 
php > $david = urldecode('David%c2%a0Amess'); 
php > echo json_encode($david); 
"David\u00a0Amess" 

因此,我們可以假設你正在處理either ISO-8859 or Windows-1252, given that we're dealing with a broken NBSP.我們可以iconv解決這個問題:

php > $david = urldecode('David%A0Amess'); 
php > $david_converted = iconv('Windows-1252', 'UTF-8', $david); 
php > echo json_encode($david_converted); 
"David\u00a0Amess" 

因此,這意味着你要需要不信任假設你已經完成了SET NAMES的事情,你要從MySQL中取出什麼。很明顯,當你插入數據時出了什麼問題。你可能沒有給MySQL格式良好的UTF-8,它愚蠢地沒有抱怨。 (如果您使用的是其他更智能,更正確的數據庫,並試圖插入未編碼的NBSP,他們會拒絕輸入。)