當前位置:才華齋>計算機>php語言>

php處理json時中文問題的解決方法

php語言 閱讀(4.44K)

在專案裡面用到json操作,之前測試都是很正常的,但有時候把物件轉換成json的時候,其中有個中文屬性變成了null.遇到這種情況怎麼辦呢?下面小編為大家整理了php處理json時中文問題的解決方法,希望能幫到大家!

php處理json時中文問題的解決方法

操作的程式碼如下:

複製程式碼 程式碼如下:

$usr = new User();

echo json_encode($usr);

?>

很簡單的程式碼,無中文情況一切正常,輸出如下:

{"PlatformID":"123213","UserID":"1023"}

一旦有中文的時候會出現兩種情況。

第一種情況是物件本身的某個值為中文的屬性是utf-8編碼,則會有如下輸出:

{"PlatformID":"123213","UserID":"1023","UserName":"u00b7u00f0u00b5u00b2u00c9u00b1u00b7u00f0u00ccu00fc"}

其中的UserName是非人類語言,這個是正常的,如果我們用firebug看下就是中文的。(這個糾結了我半天)

第二種情況是非utf-8編碼,輸出會變成null:

{"PlatformID":"123213","UserID":"1023","UserName":null}

很奇怪,查了手冊後知道json_encode是隻對utf-8有效,其它編碼均會變為null.

下面就開始解決編碼轉化的問題。

在上看到別人的`函式如下:

複製程式碼 程式碼如下:

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;

}

於是拿下來轉換編碼發現已經不為null.欣喜之下用firebug開啟,發現並不是我原來的中文字元....開始糾結......

難道是要讓他轉換成原來的編碼?回去尋找原始編碼......

測試開始:

1.把$usr->UserName直接輸出,頁面頭設定charset=utf-8.亂碼

json_encode($usr)輸出UserName=null

3.頁面頭設定為charset=gbk,輸出正確->可以確定原編碼為gbk

最後通過IE,Chrome,Firefox測試得出結論:

1.保證頁面字符集與資料庫一致,輸出一定正常 。

2.做json_encode時保證資料編碼是utf-8,json_decode正常。

3.如果要對非utf-8字元做json_encode,先轉換成utf-8。

4.對非utf-8字元做json_decode的時候,千萬不能忘記轉換成原先的編碼,否則會輸出亂碼!