最近更新: 2006-11-04

JSON in PHP - PHP 5.2 正式納入 JSON extension

自 PHP 5.2 起,正式納入 JSON extension 。函數名稱跟 php-json 一樣是 json_decode()/json_encode() 。稍微要注意 json_decode() 多加了一個選擇性的參數。 PHP 官方的 json_decode() 對於 Object of JSON 的回傳型態是個體 (object) 而不是陣列 (associative array) ,但可以指定第二個參數為 true 以回傳陣列。這個差異是基於 JavaScript 和 PHP 的語法不同。對 JavaScript 而言, obj.member 和 obj['member'] 是等義的,兩者都是個體成員存取操作。對 PHP 而言, $obj->member 和 $obj['member'] 卻是不等義的,前者是個體成員存取操作,後者則是陣列索引子操作。

再次提醒, JSON 規範的字元編碼為 UTF-8 ,如果 PHP script 檔案的儲存編碼格式不是 UTF-8 (事實上, PHP 官方建議以 ISO-8859-1 編碼儲存) ,那麼調用 json_encode() 時,須先轉換編碼。 PHP 官方範例是用 utf8_encode() ,這只適用歐洲語系,對東亞語系而言是錯的! utf8_encode($s) 的結果等於 iconv('iso-8859-1', 'utf-8', $s) 。如果將一個中文字串視為 ISO-8859-1 字元集的內容編碼,那麼結果將是一個不可讀的字串。

$s = '這是一個中文字串'; 
// save file as Big5 encoding.

$json1 = json_encode(array('name' => utf8_encode($s)));
$json2 = json_encode(array('name' => iconv('big5', 'utf-8', $s)));

echo '<script type="text/ecmascript">';
echo "var json1 = {$json1};\n";
echo "var josn2 = {$json2};\n";
echo 'window.alert(json1.name);';//un-readable
echo 'window.alert(json2.name);';
echo '</script>';
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2418349.html

樂多舊回應
chenwenj@gmail.com(King) (#comment-18034523)
Wed, 26 Nov 2008 12:29:16 +0800
就算我的PHP文件是UTF-8編碼,直接調用 utf8_encode 後出來的結果也是不可讀
\u00e5\u009c\u00a8\u00e5\u009c\u00a8\u00e5\u009c\u00a8\u00e5\u00b7\u00a5\u00e5\u00b7\u00a5\u00e6\u009c\u0089\u00e5\u00b7\u00a5\u00e8\u0089\u00ba\u00e6\u009c\u00af\u00e5\u009c\u00a8\u00e5\u009c\u008b
chenwenj@gmail.com(King) (#comment-18034875)
Wed, 26 Nov 2008 13:31:49 +0800
utf8_encode把值編碼了,不過不知道是編成什么碼(好像是unicode)
但是以上字符串在js中可以直接eval