php處理json時(shí)中文問題的解決方法
更新時(shí)間:2011年04月12日 22:12:36 作者:
最近在項(xiàng)目里面用到j(luò)son操作,之前測試都是很正常的,不過今天在把對(duì)象轉(zhuǎn)換成json的時(shí)候,其中有個(gè)中文屬性變成了null.
操作的代碼如下:
<?php
$usr = new User();
echo json_encode($usr);
?>
很簡單的代碼,無中文情況一切正常,輸出如下:
{"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是非人類語言,這個(gè)是正常的,如果我們用firebug看下就是中文的。(這個(gè)糾結(jié)了我半天)
第二種情況是非utf-8編碼,輸出會(huì)變成null:
{"PlatformID":"123213","UserID":"1023","UserName":null}
很奇怪,查了手冊(cè)后知道json_encode是只對(duì)utf-8有效,其它編碼均會(huì)變?yōu)閚ull.
下面就開始解決編碼轉(zhuǎ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;
}
于是拿下來轉(zhuǎn)換編碼發(fā)現(xiàn)已經(jīng)不為null.欣喜之下用firebug打開,發(fā)現(xiàn)并不是我原來的中文字符....開始糾結(jié)......
難道是要讓他轉(zhuǎn)換成原來的編碼?回去尋找原始編碼......
測試開始:
1.把$usr->UserName直接輸出,頁面頭設(shè)置charset=utf-8.亂碼
2.echo json_encode($usr)輸出UserName=null
3.頁面頭設(shè)置為charset=gbk,輸出正確->可以確定原編碼為gbk
最后通過IE,Chrome,Firefox測試得出結(jié)論:
1.保證頁面字符集與數(shù)據(jù)庫一致,輸出一定正常 。
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í)候,千萬不能忘記轉(zhuǎn)換成原先的編碼,否則會(huì)輸出亂碼!!
困擾了一天的問題終于搞定了。
復(fù)制代碼 代碼如下:
<?php
$usr = new User();
echo json_encode($usr);
?>
很簡單的代碼,無中文情況一切正常,輸出如下:
{"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是非人類語言,這個(gè)是正常的,如果我們用firebug看下就是中文的。(這個(gè)糾結(jié)了我半天)
第二種情況是非utf-8編碼,輸出會(huì)變成null:
{"PlatformID":"123213","UserID":"1023","UserName":null}
很奇怪,查了手冊(cè)后知道json_encode是只對(duì)utf-8有效,其它編碼均會(huì)變?yōu)閚ull.
下面就開始解決編碼轉(zhuǎ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;
}
于是拿下來轉(zhuǎn)換編碼發(fā)現(xiàn)已經(jīng)不為null.欣喜之下用firebug打開,發(fā)現(xiàn)并不是我原來的中文字符....開始糾結(jié)......
難道是要讓他轉(zhuǎn)換成原來的編碼?回去尋找原始編碼......
測試開始:
1.把$usr->UserName直接輸出,頁面頭設(shè)置charset=utf-8.亂碼
2.echo json_encode($usr)輸出UserName=null
3.頁面頭設(shè)置為charset=gbk,輸出正確->可以確定原編碼為gbk
最后通過IE,Chrome,Firefox測試得出結(jié)論:
1.保證頁面字符集與數(shù)據(jù)庫一致,輸出一定正常 。
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í)候,千萬不能忘記轉(zhuǎn)換成原先的編碼,否則會(huì)輸出亂碼!!
困擾了一天的問題終于搞定了。
您可能感興趣的文章:
- php中json_decode()和json_encode()的使用方法
- 淺析php中json_encode()和json_decode()
- PHP json_decode函數(shù)詳細(xì)解析
- php5.2以下版本無json_decode函數(shù)的解決方法
- php使用json_decode后數(shù)字對(duì)象轉(zhuǎn)換成了科學(xué)計(jì)數(shù)法的解決方法
- 關(guān)于php中的json_encode()和json_decode()函數(shù)的一些說明
- php json_encode與json_decode詳解及實(shí)例
- php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法
- PHP使用json_encode函數(shù)時(shí)不轉(zhuǎn)義中文的解決方法
- php中json_encode中文編碼問題分析
- PHP實(shí)現(xiàn)json_decode不轉(zhuǎn)義中文的方法
相關(guān)文章
php中g(shù)et_meta_tags()、CURL與user-agent用法分析
這篇文章主要介紹了php中g(shù)et_meta_tags()、CURL與user-agent用法,以實(shí)例形式較為詳細(xì)的分析了get_meta_tags()、CURL與user-agent使用時(shí)的注意事項(xiàng)與用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12PHP中addslashes與mysql_escape_string的區(qū)別分析
這篇文章主要介紹了PHP中addslashes與mysql_escape_string的區(qū)別,簡單分析了addslashes與mysql_escape_string在使用過程中的區(qū)別,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-04-04基于PHP實(shí)現(xiàn)郵箱驗(yàn)證激活過程詳解
這篇文章主要介紹了基于PHP實(shí)現(xiàn)郵箱驗(yàn)證激活過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10深入理解PHP原理之錯(cuò)誤抑制與內(nèi)嵌HTML分析
PHP支持內(nèi)嵌HTML的, 那么對(duì)于PHP文件中, PHP標(biāo)簽外的HTML會(huì)怎么處理呢? 它和直接輸出HTML有什么區(qū)別么?2011-05-05修改php.ini以達(dá)到屏蔽錯(cuò)誤信息并記錄日志
這篇文章主要介紹了通過修改php.ini文件來實(shí)現(xiàn)如果關(guān)閉與開啟錯(cuò)去信息,并給出了比較好的方法,既能看到錯(cuò)誤信息也防止信息泄露問題2013-06-06PHP的偽隨機(jī)數(shù)與真隨機(jī)數(shù)詳解
這篇文章主要介紹了PHP的偽隨機(jī)數(shù)與真隨機(jī)數(shù)詳解,本文首先講解了真隨機(jī)數(shù)和偽隨機(jī)數(shù)的相關(guān)概念,并給出了比用mt_rand()函數(shù)產(chǎn)生更好的偽隨機(jī)數(shù)的一段例子代碼,需要的朋友可以參考下2015-05-05為你總結(jié)一些php系統(tǒng)類函數(shù)
這篇文章是小編為大家總結(jié)的一些php系統(tǒng)類函數(shù),很實(shí)用,需要的朋友千萬不要錯(cuò)過。2015-10-10