2012-09-19 96 views
0

我使用CakePHP輸出包含多個UTF-8編碼字符串的數組。我有一個佈局設置爲輸出(這是一個REST API方法):json_encode()從輸出中排除UTF-8編碼的字符串

<?php. 
    header("Pragma: no-cache");. 
    header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");. 
    header('Content-Type: application/json; charset=UTF-8');. 
    header("X-JSON: ".$content_for_layout);. 
    echo $content_for_layout;. 
?> 

這是我的看法:

<?php echo json_encode($items); ?> 

我的數據庫表在那裏我得到的數據是在UTF-8編碼。但是當我輸出數據時,如果其中一個元素具有像à,á等特殊字符,則該字符串將在JSON數組中設置爲null。我怎樣才能正確輸出我的數據?

回答

2

看起來你的數據庫連接沒有設置爲utf-8,這是最重要的部分。所以加'encoding' => 'utf8'到數據庫配置在app/config/database.php,例如:

'default' => array(
     'driver' => 'mysql', 
     'host'  => 'YOURHOST', 
     'login' => 'YOURLOGIN', 
     'password' => 'YOURPASS', 
     'database' => 'YOURDB', 
     'encoding' => 'utf8' 
    ), 

如果您沒有設置在連接的編碼,「默認」編碼將被使用。默認可能不是utf8。

+0

讓我檢查一下,雖然有問題,但有些表設置爲latin1,其他表設置爲utf8,這不會產生一些不一致嗎?(不要判斷我:(我沒有設置數據庫或站點) – 8vius

+0

剛剛檢查並且編碼設置爲utf-8,與utf8有什麼區別? – 8vius

+0

@ 8vius MySQL稱它爲「utf8」,而不是「 utf-8「。應用程序一直在巡航,破損的編碼設置到目前爲止...... – deceze

0
$items = json_encode(array_map(function($text){ return is_string($text) ? utf8_encode($text) : $text; }, $items)) 
echo $items; 
+0

同樣的錯誤,來自數據庫的數據是alreadt utf-8編碼的。 – 8vius

1

這很可能意味着你的數據是不 UTF-8,最有可能的編碼,因爲數據庫連接未設置爲UTF-8,你實際上是在處理latin1上接收數據PHP方面。請參閱Handling Unicode Front To Back In A Web App瞭解所有陷阱的細節。

+0

我的數據庫表設置爲utf8_general_ci,我該如何爲CakePHP做適當的設置?雖然我真的不應該因爲我可能打破整個網站(我沒有開發它,我只是添加一個API方法) – 8vius

+0

@Joni剛剛提供了答案。如果你不能改變這個默認值(事實上,如果你的數據在沒有正確的連接設置的情況下被使用,如果你改變它的話你的數據將會變得非常糟糕),你必須手動轉換字符串的編碼,如其他答案。爲什麼這對你不起作用我不知道。向我們展示其中一個字符串的'bin2hex($ string)',以便我們可以看到它們看起來像什麼編碼。 – deceze

+0

只是做了@Joni說的更改,現在我得到字符串編碼的字符,例如\ u00f3,並在視圖中,它被打破,並顯示像ö – 8vius