php處理json時(shí)中文問(wèn)題的解決方法
更新時(shí)間:2011年04月12日 22:12:36 作者:
最近在項(xiàng)目里面用到j(luò)son操作,之前測(cè)試都是很正常的,不過(guò)今天在把對(duì)象轉(zhuǎn)換成json的時(shí)候,其中有個(gè)中文屬性變成了null.
操作的代碼如下:
<?php
$usr = new User();
echo json_encode($usr);
?>
很簡(jiǎn)單的代碼,無(wú)中文情況一切正常,輸出如下:
{"PlatformID":"123213","UserID":"1023"}
一旦有中文的時(shí)候會(huì)出現(xiàn)兩種情況。
第一種情況是對(duì)象本身的某個(gè)值為中文的屬性是utf-8編碼,則會(huì)有如下輸出:
{"PlatformID":"123213","UserID":"1023","UserName":"\u00b7\u00f0\u00b5\u00b2\u00c9\u00b1\u00b7\u00f0\u00cc\u00fc"}
其中的UserName是非人類(lèi)語(yǔ)言,這個(gè)是正常的,如果我們用firebug看下就是中文的。(這個(gè)糾結(jié)了我半天)
第二種情況是非utf-8編碼,輸出會(huì)變成null:
{"PlatformID":"123213","UserID":"1023","UserName":null}
很奇怪,查了手冊(cè)后知道json_encode是只對(duì)utf-8有效,其它編碼均會(huì)變?yōu)閚ull.
下面就開(kāi)始解決編碼轉(zhuǎn)化的問(wèn)題。
在php.net上看到別人的函數(shù)如下:
private function to_utf8($in)
{
if (is_array($in)) {
foreach ($in as $key => $value)
{
$out[$this->to_utf8($key)] = $this->to_utf8($value);
}
}
elseif(is_string($in))
{
if(mb_detect_encoding($in) != "UTF-8")
return utf8_encode($in);
else
return $in;
}
else
{
return $in;
}
return $out;
}
于是拿下來(lái)轉(zhuǎn)換編碼發(fā)現(xiàn)已經(jīng)不為null.欣喜之下用firebug打開(kāi),發(fā)現(xiàn)并不是我原來(lái)的中文字符....開(kāi)始糾結(jié)......
難道是要讓他轉(zhuǎn)換成原來(lái)的編碼?回去尋找原始編碼......
測(cè)試開(kāi)始:
1.把$usr->UserName直接輸出,頁(yè)面頭設(shè)置charset=utf-8.亂碼
2.echo json_encode($usr)輸出UserName=null
3.頁(yè)面頭設(shè)置為charset=gbk,輸出正確->可以確定原編碼為gbk
最后通過(guò)IE,Chrome,Firefox測(cè)試得出結(jié)論:
1.保證頁(yè)面字符集與數(shù)據(jù)庫(kù)一致,輸出一定正常 。
2.做json_encode時(shí)保證數(shù)據(jù)編碼是utf-8,json_decode正常。
3.如果要對(duì)非utf-8字符做json_encode,先轉(zhuǎn)換成utf-8。
4.對(duì)非utf-8字符做json_decode的時(shí)候,千萬(wàn)不能忘記轉(zhuǎn)換成原先的編碼,否則會(huì)輸出亂碼!!
困擾了一天的問(wèn)題終于搞定了。
復(fù)制代碼 代碼如下:
<?php
$usr = new User();
echo json_encode($usr);
?>
很簡(jiǎn)單的代碼,無(wú)中文情況一切正常,輸出如下:
{"PlatformID":"123213","UserID":"1023"}
一旦有中文的時(shí)候會(huì)出現(xiàn)兩種情況。
第一種情況是對(duì)象本身的某個(gè)值為中文的屬性是utf-8編碼,則會(huì)有如下輸出:
{"PlatformID":"123213","UserID":"1023","UserName":"\u00b7\u00f0\u00b5\u00b2\u00c9\u00b1\u00b7\u00f0\u00cc\u00fc"}
其中的UserName是非人類(lèi)語(yǔ)言,這個(gè)是正常的,如果我們用firebug看下就是中文的。(這個(gè)糾結(jié)了我半天)
第二種情況是非utf-8編碼,輸出會(huì)變成null:
{"PlatformID":"123213","UserID":"1023","UserName":null}
很奇怪,查了手冊(cè)后知道json_encode是只對(duì)utf-8有效,其它編碼均會(huì)變?yōu)閚ull.
下面就開(kāi)始解決編碼轉(zhuǎn)化的問(wèn)題。
在php.net上看到別人的函數(shù)如下:
復(fù)制代碼 代碼如下:
private function to_utf8($in)
{
if (is_array($in)) {
foreach ($in as $key => $value)
{
$out[$this->to_utf8($key)] = $this->to_utf8($value);
}
}
elseif(is_string($in))
{
if(mb_detect_encoding($in) != "UTF-8")
return utf8_encode($in);
else
return $in;
}
else
{
return $in;
}
return $out;
}
于是拿下來(lái)轉(zhuǎn)換編碼發(fā)現(xiàn)已經(jīng)不為null.欣喜之下用firebug打開(kāi),發(fā)現(xiàn)并不是我原來(lái)的中文字符....開(kāi)始糾結(jié)......
難道是要讓他轉(zhuǎn)換成原來(lái)的編碼?回去尋找原始編碼......
測(cè)試開(kāi)始:
1.把$usr->UserName直接輸出,頁(yè)面頭設(shè)置charset=utf-8.亂碼
2.echo json_encode($usr)輸出UserName=null
3.頁(yè)面頭設(shè)置為charset=gbk,輸出正確->可以確定原編碼為gbk
最后通過(guò)IE,Chrome,Firefox測(cè)試得出結(jié)論:
1.保證頁(yè)面字符集與數(shù)據(jù)庫(kù)一致,輸出一定正常 。
2.做json_encode時(shí)保證數(shù)據(jù)編碼是utf-8,json_decode正常。
3.如果要對(duì)非utf-8字符做json_encode,先轉(zhuǎn)換成utf-8。
4.對(duì)非utf-8字符做json_decode的時(shí)候,千萬(wàn)不能忘記轉(zhuǎn)換成原先的編碼,否則會(huì)輸出亂碼!!
困擾了一天的問(wèn)題終于搞定了。
您可能感興趣的文章:
- php中json_decode()和json_encode()的使用方法
- 淺析php中json_encode()和json_decode()
- PHP json_decode函數(shù)詳細(xì)解析
- php5.2以下版本無(wú)json_decode函數(shù)的解決方法
- php使用json_decode后數(shù)字對(duì)象轉(zhuǎn)換成了科學(xué)計(jì)數(shù)法的解決方法
- 關(guān)于php中的json_encode()和json_decode()函數(shù)的一些說(shuō)明
- php json_encode與json_decode詳解及實(shí)例
- php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法
- PHP使用json_encode函數(shù)時(shí)不轉(zhuǎn)義中文的解決方法
- php中json_encode中文編碼問(wèn)題分析
- PHP實(shí)現(xiàn)json_decode不轉(zhuǎn)義中文的方法
相關(guān)文章
Yii2使用駝峰命名的形式訪問(wèn)控制器(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇Yii2使用駝峰命名的形式訪問(wèn)控制器(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
php報(bào)表之jpgraph柱狀圖實(shí)例代碼
jpgraph是php中一個(gè)非常非常強(qiáng)大的第三方報(bào)表工具,據(jù)說(shuō)能完成一切你想要的圖形2011-08-08
PHP簡(jiǎn)單實(shí)現(xiàn)數(shù)字分頁(yè)功能示例
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)數(shù)字分頁(yè)功能,結(jié)合實(shí)例形式分析了php數(shù)字分頁(yè)相關(guān)的數(shù)學(xué)運(yùn)算與字符串操作相關(guān)技巧,需要的朋友可以參考下2016-08-08
PHP獲取當(dāng)前日期所在星期(月份)的開(kāi)始日期與結(jié)束日期(實(shí)現(xiàn)代碼)
本篇文章是對(duì)PHP獲取當(dāng)前日期所在星期(月份)的開(kāi)始日期與結(jié)束日期的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP的autoload機(jī)制的實(shí)現(xiàn)解析
在使用PHP的OO模式開(kāi)發(fā)系統(tǒng)時(shí),通常大家習(xí)慣上將每個(gè)類(lèi)的實(shí)現(xiàn)都存放在一個(gè)單獨(dú)的文件里,這樣會(huì)很容易實(shí)現(xiàn)對(duì)類(lèi)進(jìn)行復(fù)用,同時(shí)將來(lái)維護(hù)時(shí)也很便利2012-09-09
phpcms的分類(lèi)名稱(chēng)和類(lèi)別名稱(chēng)的調(diào)用
本文主要介紹了phpcms的分類(lèi)名稱(chēng)和類(lèi)別名稱(chēng)的調(diào)用。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
PHP實(shí)現(xiàn)更改hosts文件的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)更改hosts文件的方法,結(jié)合具體實(shí)例形式分析了php操作hosts文件的相關(guān)讀取、設(shè)置、刪除等實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08

