在PHP開發(fā)過程中,經(jīng)常會(huì)遇到JSON中文亂碼的問題。這是因?yàn)镴SON默認(rèn)采用的編碼格式是Unicode,而中文在Unicode中占兩個(gè)字節(jié),如果在采用utf-8編碼的情況下,JSON就會(huì)出現(xiàn)亂碼的情況,這時(shí)我們需要進(jìn)行一些處理才能正確解析JSON。
例如,我們有一個(gè)JSON字符串如下:
{"name":"張三","age":18}我們使用PHP中的json_decode()函數(shù)將其解析為一個(gè)對(duì)象或數(shù)組,代碼如下:
$jsonStr = '{"name":"張三","age":18}'; $obj = json_decode($jsonStr); print_r($obj);如果我們直接運(yùn)行這段代碼,可能會(huì)出現(xiàn)以下結(jié)果:
stdClass Object ( [name] =>???? [age] =>18 )我們可以看到,name屬性出現(xiàn)了亂碼。這是因?yàn)槟J(rèn)情況下,PHP的json_decode()函數(shù)將JSON字符串中的中文解析為Unicode編碼,而直接輸出Unicode編碼會(huì)出現(xiàn)亂碼。 為了解決這個(gè)問題,我們需要將JSON字符串中的中文轉(zhuǎn)換為UTF-8編碼。我們可以使用PHP中的json_decode()函數(shù)的第二個(gè)參數(shù)來實(shí)現(xiàn)該功能,例如:
$jsonStr = '{"name":"張三","age":18}'; $obj = json_decode($jsonStr, true); $obj = array_map('decodeUnicode', $obj); print_r($obj); function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($matches) { return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UCS-2BE'); }, $str); }這段代碼中,我們使用了array_map()和preg_replace_callback()函數(shù)來將JSON字符串中所有的Unicode編碼轉(zhuǎn)換為UTF-8編碼。最終得到的輸出結(jié)果如下:
Array ( [name] =>張三 [age] =>18 )我們可以看到,此時(shí)name屬性已經(jīng)正確地輸出為中文了。 除了在JSON解析時(shí)轉(zhuǎn)換中文編碼外,我們還可以在生成JSON字符串的時(shí)候,通過設(shè)置編碼格式來避免出現(xiàn)中文亂碼的情況。例如,我們將一個(gè)數(shù)組轉(zhuǎn)換為JSON字符串,代碼如下:
$data = array('name' =>'張三', 'age' =>18); $jsonStr = json_encode($data, JSON_UNESCAPED_UNICODE); echo $jsonStr;這段代碼中,我們使用了json_encode()函數(shù)的第二個(gè)參數(shù)JSON_UNESCAPED_UNICODE來指定生成的JSON字符串中中文不進(jìn)行Unicode編碼,而直接輸出為中文。最終得到的輸出結(jié)果如下:
{"name":"張三","age":18}可以看到,此時(shí)JSON字符串中的中文已經(jīng)正確地輸出為中文了。 總之,在PHP開發(fā)過程中遇到JSON中文亂碼的問題,我們可以通過在JSON解析時(shí)手動(dòng)轉(zhuǎn)換中文編碼或在生成JSON字符串時(shí)設(shè)置編碼格式來避免出現(xiàn)亂碼的情況。