剛好有機會碰到這個問題,雖然發現原因也解決了,但也花了我一些時間,所以…筆記筆記
只要有利用PHP寫過API或將server side的資料吐給client side用js處理相關的應用,對PHP的json_encode應該不陌生,但這個好東西使用上也有一些限制,其中有一項就是它只吃UTF-8編碼的字串!官方文件也有提到:
All string data must be UTF-8 encoded.
因為最近碰到DB的charset不是UTF-8,然後我又依照以前的方式,把資料從DB撈出來之後就直接:
echo json_encode($arr);
但這會有問題,例如字串的編碼不是UTF-8,像這樣:
$arr = array( 'id' => 1, 'description' => '我不是UTF-8編碼的字串唷!' ); echo json_encode($arr);
echo的結果會是:
{"id":1,"description":null}
一開始的時候還以為是我下的SQL select statement沒寫好,後來才發現是編碼的問題,這邊有兩個方法解決這個問題
1.使用urlencode和urldecode
原理:先使用urlencode將非UTF-8的字串轉換,然後echo json_encode的時候在urldecode:
echo urldecode(json_encode($str));
2.使用mb_convert_encodeing或iconv
先將非UTF-8的字串轉為UTF-8,然後在echo json_encode時,再把字串轉回非UTF-8編碼
echo mb_convert_encoding($str, "UTF-8", "BIG5");
恍然小悟
確認是編碼的問題後,也讓我突然理解為何echo json_encode($str)的中文字在瀏覽器上看都會變成\uxxxx