PHP默認的json_encode編碼出來的是unicode編碼的,也就是\u的編碼,用PHP的json_encode來處理中文的時候, 中文都會被編碼, 變成不可讀的, 相似」\u***」的格式。php
/默認爲:{"test":"\u6211\u662f\u6d4b\u8bd5"}
雖然unicode編碼能夠在不一樣的頁面中編碼不會出現亂碼問題。可是一個漢字編碼成unicode會變成\u+4個字符,增長了字符串的長度,還會在必定程度上增長傳輸的數據量.json
程序問題: 1.頁面使用GBK編碼格式,當字符串內有漢字是,echo 沒數據輸出 把漢字改爲英文則有數據輸出數組
{"ResponseCode":"01","ResponseInfo":"english","CardID":""}
json_encode出null的問題 若是文檔編碼或者字符串編碼(例如UTF-8抓取了一個GBK頁面)爲非UTF-8,就會出現json_encode編碼失敗的問題,變現爲輸出漢字爲null。函數
解決的方法就是在json_encode以前用iconv函數將漢字轉爲UTF-8。編碼
2.頁面使用UTF-8編碼,有數據輸出,可是出現亂碼url
{"ResponseCode":"01","ResponseInfo":"\u53c2\u6570\u4e0d\u5b8c\u6574\uff0c\u4ea4\u6613\u5931\u8d25","CardID":""}
緣由: PHP5.2或以上的版本把json_encode做爲內置函數來用,但只支持utf-8編碼的字符,不然中文就會出現亂碼或者空值code
解決辦法以下: 保證在使用JSON處理的時候字符是以UTF8編碼的,若是喜歡用gbk編碼的話,能夠在進行JSON處理前,把字符轉爲UTF8形式。 1.轉換中文字符串格式utf-8
<?php $data="JSON中文"; $newData=iconv("GB2312","UTF-8//IGNORE",$data); echo $newData; ?>
//ignore的意思是忽略轉換時的錯誤,若是沒有ignore參數,全部該字符後面的字符都不會被保存。
2.頁面編碼爲UTF-8或者已經把字符轉爲UTF-8,使用json_encode將PHP中的array數組轉爲JSON字符串unicode
<?php $testJSON=array('name'=>'中文字符串','value'=>'test'); echo json_encode($testJSON); ?>
查看輸出結果爲:
{「name」:」\u4e2d\u6587\u5b57\u7b26\u4e32″,」value」:」test」}
可見即便用UTF8編碼的字符,使用json_encode也出現了中文亂碼。文檔
解決辦法:
在使用json_encode以前把字符用函數urlencode()處理一下,而後再json_encode,輸出結果的時候在用函數urldecode()轉回來。具體以下:
<?php $testJSON=array('name'=>'中文字符串','value'=>'test'); foreach ( $testJSON as $key => $value ) { $testJSON[$key] = urlencode ( $value ); } echo urldecode ( json_encode ( $testJSON ) ); ?>
此時輸出結果爲: {「name」:」中文字符串」,」value」:」test」}
總結: 中文字符串必須爲UTF-8編碼,且須要進行urlencode() 編碼和urldecode() 解碼進行輸出
方法二: PHP5.4版本,已經給Json新增了一個選項: JSON_UNESCAPED_UNICODE。加上這個選項後,就不會自動把中文編碼了。 爲json_encode()設置第二個參數 JSON_UNESCAPED_UNICODE
$url = '中國'; //echo json_encode($url); 亂碼 echo json_encode($url,JSON_UNESCAPED_UNICODE ); //正常輸出
JSON_UNESCAPED_UNICODE :以字面編碼多字節 Unicode 字符(默認是編碼成 \uXXXX)。** 自 PHP 5.4.0 起生效**
方法三
對unicode碼再進行解碼,解碼函數以下:
<?php function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function( '$matches', 'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");' ), $str); } $arr = array('name1'=>"中文",'name2'=>'abc12'); echo decodeUnicode(json_encode($arr));