[PHP] 使用 json_encode 的字串編碼必須為UTF-8

剛好有機會碰到這個問題,雖然發現原因也解決了,但也花了我一些時間,所以…筆記筆記

只要有利用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

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s