解決json_encode中文UNICODE轉碼問題

2013-11-21

用 PHP 的 json_encode 來處理中文的時候,中文都會被編碼,變成不可讀的,類似”\u***”的格式,有時候網頁上也會直接顯示null,最主要的原因是為了與前端緊密結合, json 只支援 utf8,如果想要讓中文不進行轉碼,這裡提供兩種簡單方法

1. 在PHP5.4, 這個問題終於得以解決, Json 新增了一個選項: JSON_UNESCAPED_UNICODE, 故名思議, 就是說, Json不要編碼Unicode, 那就不會有中文亂碼的問題了。
echo json_encode("中文", JSON_UNESCAPED_UNICODE);

2. 把中文先 urlencode 然後再使用 json_encode, json_encode 之後再次使用 urldecode 來解碼,這樣編碼出來的 json 中的中文就不會出現 unicode 編碼了。
這裡我提供一個尋訪 array 中 vlaue 為 string 的變數,幫這些變數加上這種機制。

//Convent to json format directly
$data = array(
    'title' => '惡靈古堡',
    'year'  => 2012
);
$json = json_encode($data);
echo "$json
";
 
//Use urlencode to workaround for json_encode without JSON_UNESCAPED_UNICODE
array_walk_recursive($data, function(&$value, $key) {
    if(is_string($value)) {
        $value = urlencode($value);
    }
});
$json = urldecode(json_encode($data));
echo "$json
";
 
測試的結果:
{"title":null,"year":2012}
{"title":"惡靈古堡","year":2012} 

這個原理很簡單,因為只有中文會讓 json_encode 出現亂碼,那麼我們先用 urlencode 讓字串不會有中文,當被編碼後的字串被 json_encode 處理過後,再利用 urldecode 將剛剛的字串轉回來。

Contact

Github

Codepen

歡迎參觀我的賣場
© 2013 Copyright Digishot Web | Design Tools
Visitors【333595】
digishot webdesign studio