網頁

2013年3月25日

解決json_encode中文UNICODE轉碼問題

用 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 將剛剛的字串轉回來。

3 則留言:

  1. 上述那個array_walk_recursive用法會錯誤!!
    Parse error: syntax error, unexpected T_FUNCTION in ......
    改成
    function test_print(&$value, $key) {
    if(is_string($value)) {
    $value = urlencode($value);
    }
    }
    array_walk_recursive($data, 'test_print');
    這樣子才不會有錯誤!!

    回覆刪除
    回覆
    1. 請問你是指 Anonymous Function的問題嗎
      假如是這個的話,在新版的php已經有支援了
      還是你是說其他的地方呢?

      刪除