PHP5.4中json_encode中文轉(zhuǎn)碼的變化小結(jié)
更新時(shí)間:2013年01月30日 11:08:03 作者:
在php5.4以前做json_encode的時(shí)候中文會(huì)被unicode編碼,中文都會(huì)被編碼,變成不可讀的,類似“\u***”的格式,接下來介紹幾種5.4之前不進(jìn)行unicode轉(zhuǎn)碼的處理方法
在php5.4以前做json_encode的時(shí)候中文會(huì)被unicode編碼,中文都會(huì)被編碼,變成不可讀的,類似“\u***”的格式,還會(huì)在一定程度上增加傳輸?shù)臄?shù)據(jù)量。
例如:
<?php
$str = '中文';
echo json_encode($str);
//"\u4e2d\u6587"
php5.4開始
echo json_encode($str, JSON_UNESCAPED_UNICODE);
//"中文"
php5.4讓json更懂中文!
5.4之前不進(jìn)行unicode轉(zhuǎn)碼,有3種方法處理:
但其實(shí)前兩種方式是會(huì)導(dǎo)致問題,在一些特殊的情況下。如下例:
function myjson($code) {
$code = json_encode(urlencodeAry($code));
return urldecode($code);
}
function urlencodeAry($data) {
if(is_array($data)) {
foreach($data as $key=>$val) {
$data[$key] = urlencodeAry($val);
}
return $data;
} else {
return urlencode($data);
}
}
$test = array (
0 => '"大連周水子機(jī)場(chǎng)"→人民路',
1 => '運(yùn)營時(shí)間:5:10~21:00 票價(jià):16元 發(fā)車間隔20分鐘一班,客滿隨時(shí)發(fā)車',
);
/*
通過常規(guī)則的json_encode|json_decode來編解碼
["\"\u5927\u8fde\u5468\u6c34\u5b50\u673a\u573a\"\u2192\u4eba\u6c11\u8def","\u8fd0\u8425\u65f6
\u95f4\uff1a5\uff1a10\uff5e21\uff1a00 \u7968\u4ef7\uff1a16\u5143 \u53d1\u8f66\u95f4\u969420
\u5206\u949f\u4e00\u73ed\uff0c\u5ba2\u6ee1\u968f\u65f6\u53d1\u8f66"]
array (
0 => '"大連周水子機(jī)場(chǎng)"→人民路',
1 => '運(yùn)營時(shí)間:5:10~21:00 票價(jià):16元 發(fā)車間隔20分鐘一班,客滿隨時(shí)發(fā)車',
)
*/
$test1 = json_encode($test);
$test2 = json_decode($test1, TRUE);
echo $test1;
echo PHP_EOL;
var_export($test2);
echo PHP_EOL;
/*
通過myjson|json_decode來編解碼,但是會(huì)出報(bào)錯(cuò)json_last_error返回(JSON_ERROR_SYNTAX === 4),
因?yàn)?"大連周水子機(jī)場(chǎng)"→人民路"
[""大連周水子機(jī)場(chǎng)"→人民路","運(yùn)營時(shí)間:5:10~21:00 票價(jià):16元 發(fā)車間隔20分鐘一班,客滿隨時(shí)發(fā)車"]
NULL
*/
$test1_1 = myjson($test);
$test2_1 = json_decode($test1_1, TRUE);
echo $test1_1;
echo PHP_EOL;
var_export($test2_1);
echo PHP_EOL;
/*
通過json_enco+pack|json_decode來編解碼,保證不會(huì)對(duì)中文編碼,但是會(huì)缺少運(yùn)營時(shí)間數(shù)據(jù)和票價(jià)
["\"大連周水子機(jī)場(chǎng)\"→人民路","運(yùn)營時(shí)間::~: 票價(jià):元 發(fā)車間隔分鐘一班,客滿隨時(shí)發(fā)車"]
array (
0 => '"大連周水子機(jī)場(chǎng)"→人民路',
1 => '運(yùn)營時(shí)間::~: 票價(jià):元 發(fā)車間隔分鐘一班,客滿隨時(shí)發(fā)車',
)
*/
function replaceUni($str) {
return preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $str);
}
$test1_2 = replaceUni(json_encode($test));
$test2_2 = json_decode($test1_2, TRUE);
echo $test1_2;
echo PHP_EOL;
var_export($test2_2);
echo PHP_EOL;
最后總結(jié)一句,推薦升級(jí)到PHP5.4,讓PHP更懂中文!
例如:
復(fù)制代碼 代碼如下:
<?php
$str = '中文';
echo json_encode($str);
//"\u4e2d\u6587"
php5.4開始
echo json_encode($str, JSON_UNESCAPED_UNICODE);
//"中文"
php5.4讓json更懂中文!
5.4之前不進(jìn)行unicode轉(zhuǎn)碼,有3種方法處理:
但其實(shí)前兩種方式是會(huì)導(dǎo)致問題,在一些特殊的情況下。如下例:
復(fù)制代碼 代碼如下:
function myjson($code) {
$code = json_encode(urlencodeAry($code));
return urldecode($code);
}
function urlencodeAry($data) {
if(is_array($data)) {
foreach($data as $key=>$val) {
$data[$key] = urlencodeAry($val);
}
return $data;
} else {
return urlencode($data);
}
}
$test = array (
0 => '"大連周水子機(jī)場(chǎng)"→人民路',
1 => '運(yùn)營時(shí)間:5:10~21:00 票價(jià):16元 發(fā)車間隔20分鐘一班,客滿隨時(shí)發(fā)車',
);
/*
通過常規(guī)則的json_encode|json_decode來編解碼
["\"\u5927\u8fde\u5468\u6c34\u5b50\u673a\u573a\"\u2192\u4eba\u6c11\u8def","\u8fd0\u8425\u65f6
\u95f4\uff1a5\uff1a10\uff5e21\uff1a00 \u7968\u4ef7\uff1a16\u5143 \u53d1\u8f66\u95f4\u969420
\u5206\u949f\u4e00\u73ed\uff0c\u5ba2\u6ee1\u968f\u65f6\u53d1\u8f66"]
array (
0 => '"大連周水子機(jī)場(chǎng)"→人民路',
1 => '運(yùn)營時(shí)間:5:10~21:00 票價(jià):16元 發(fā)車間隔20分鐘一班,客滿隨時(shí)發(fā)車',
)
*/
$test1 = json_encode($test);
$test2 = json_decode($test1, TRUE);
echo $test1;
echo PHP_EOL;
var_export($test2);
echo PHP_EOL;
/*
通過myjson|json_decode來編解碼,但是會(huì)出報(bào)錯(cuò)json_last_error返回(JSON_ERROR_SYNTAX === 4),
因?yàn)?"大連周水子機(jī)場(chǎng)"→人民路"
[""大連周水子機(jī)場(chǎng)"→人民路","運(yùn)營時(shí)間:5:10~21:00 票價(jià):16元 發(fā)車間隔20分鐘一班,客滿隨時(shí)發(fā)車"]
NULL
*/
$test1_1 = myjson($test);
$test2_1 = json_decode($test1_1, TRUE);
echo $test1_1;
echo PHP_EOL;
var_export($test2_1);
echo PHP_EOL;
/*
通過json_enco+pack|json_decode來編解碼,保證不會(huì)對(duì)中文編碼,但是會(huì)缺少運(yùn)營時(shí)間數(shù)據(jù)和票價(jià)
["\"大連周水子機(jī)場(chǎng)\"→人民路","運(yùn)營時(shí)間::~: 票價(jià):元 發(fā)車間隔分鐘一班,客滿隨時(shí)發(fā)車"]
array (
0 => '"大連周水子機(jī)場(chǎng)"→人民路',
1 => '運(yùn)營時(shí)間::~: 票價(jià):元 發(fā)車間隔分鐘一班,客滿隨時(shí)發(fā)車',
)
*/
function replaceUni($str) {
return preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $str);
}
$test1_2 = replaceUni(json_encode($test));
$test2_2 = json_decode($test1_2, TRUE);
echo $test1_2;
echo PHP_EOL;
var_export($test2_2);
echo PHP_EOL;
最后總結(jié)一句,推薦升級(jí)到PHP5.4,讓PHP更懂中文!
您可能感興趣的文章:
相關(guān)文章
php將數(shù)據(jù)庫導(dǎo)出成excel的方法
有時(shí)寫程序時(shí)后臺(tái)要求把大量數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中,比如考試成績(jī)、電話簿等一般都是存放在excel中的數(shù)據(jù),這時(shí)我們可把excel導(dǎo)出成csv文件,然后通過以下程序即可批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中2010-05-05PHP+ajax實(shí)現(xiàn)上傳、刪除、修改單張圖片及后臺(tái)處理邏輯操作詳解
這篇文章主要介紹了PHP+ajax實(shí)現(xiàn)上傳、刪除、修改單張圖片及后臺(tái)處理邏輯操作,結(jié)合實(shí)例形式詳細(xì)分析了前臺(tái)ajax提交圖片上傳、刪除、修改以及后臺(tái)PHP邏輯處理相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-02-02PHP商品秒殺問題解決方案實(shí)例詳解【mysql與redis】
這篇文章主要介紹了PHP商品秒殺問題解決方案,結(jié)合實(shí)例形式詳細(xì)分析了php結(jié)合mysql與redis實(shí)現(xiàn)商品秒殺功能的相關(guān)操作技巧及注意事項(xiàng),需要的朋友可以參考下2019-07-07php 批量生成html,txt文件的實(shí)現(xiàn)代碼
本篇文章是對(duì)使用php批量生成html,txt文件的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP魔術(shù)方法之__call與__callStatic使用方法
這篇文章主要介紹了PHP魔術(shù)方法之__call與__callStatic方法,需要的朋友可以參考下2017-07-07phpmyadmin里面導(dǎo)入sql語句格式的大量數(shù)據(jù)的方法
phpmyadmin里面導(dǎo)入sql語句格式的大量數(shù)據(jù)的方法2010-06-06PHP終止腳本運(yùn)行三種實(shí)現(xiàn)方法詳解
這篇文章主要介紹了PHP終止腳本運(yùn)行三種實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09