php項目中經常遇到中文亂碼,這是一個令人討厭的問題。但是,當需要將內容輸出到網頁時,我們遵循以下兩個原則,并且通常不會出現中文亂碼。
首先是添加html頭
第二點是確保文件的編碼與meta設置的編碼一致。換句話說,如果我們的第一個字符集設置為utf-8,那么我們的文件編碼也應該設置為utf-8。兩者應該保持一致。
當然,以上是針對網頁的情況,但是現在隨著ajax在web應用程序中所占的比例越來越高,json格式的數據在數據傳輸中的使用越來越廣泛。因此,當您使用json_encode在php中將數據轉換為json時,會遇到中文亂碼或中文編碼的問題。
例如,
$data = array('id'=>1,'name'=>'跡憶博客','parid'=>0);echo json_encode($data);
以上代碼的輸出結果為
{id:1,name:\u8ff9\u5fc6\u535a\u5ba2,parid:0}
讓我們看一下,該功能已對中文“集意博客”進行了十六進制轉碼。不能說這是一個錯誤,因為十六進制表示形式是正確的中文。得到此結果后php json encode 編碼,我們還可以通過前端的js獲得所需的結果。但是,以這種方式使用仍然很麻煩。當然,情況會因php版本而異。
對于某些版本的php,結果將如下所示
{id:1,name:null,parid:0}
中文無法正確解析。
沒有辦法,中國問題太麻煩了。誰使計算機不是中國人發明的?當然,有解決方案。讓我們了解兩種解決方案。
一、由json_encode的第二個參數解決
為解決上述問題,可以通過json_encode函數本身直接解決php> =5.4.0的版本。那是第二個參數加上json_unescaped_unicode。
$data = array('id'=>1,'name'=>'跡憶博客','parid'=>0);echo json_encode($data, json_unescaped_unicode);
現在您可以獲得正確的結果
{id:1,name:跡憶博客,parid:0}
正確獲得了結果。但是,php的版本不能更改為5.4及更高版本。如何處理5.4以下的版本?
二、通過url編碼解決中文問題
我們知道php中有兩個函數:urlencode和urldecode。我們可以使用urlencode函數對中文進行url編碼,這樣字符串中就不會再有中文了,也不會遇到中文編碼問題。
$str = “跡憶博客”;echo urlencode($str);
對jiyi博客進行網址編碼,結果如下
%e8%bf%b9%e5%bf%86%e5%8d%9a%e5%ae%a2
因此,在使用urlencode編碼上述數組的名稱的值,然后將其轉換為json格式后,中文編碼的問題將不復存在。
我們現在得到的結果是名稱編碼后的json字符串
{id:1,name:%e8%bf%b9%e5%bf%86%e5%8d%9a%e5%ae%a2,parid:0}
最后,通過urldecode對url編碼的字符串進行解碼。當然,urldecode解碼不需要我們找到相應的編碼字符串進行解碼。我們可以直接解碼整個字符串。 urldecode將自動檢測相應的url編碼的字符串并將其解碼。
$data = array('id'=>1,'name'=>urlencode('跡憶博客'),'parid'=>0);$res =urldecode(json_encode($data));echo $res;
所以結果是正確的
{id:1,name:跡憶博客,parid:0}
此方法沒有版本限制php json encode 編碼,但是效率肯定會比第一種方法慢。
第二種方法的包裝函數-通過url編碼解決中文問題
現在是問題所在。對于第二種方法,我們不能在數組中的每個中文前面添加urlencode函數!這也是不現實的。然后,我們可以通過自己封裝json_encode函數來解決此類問題。
代碼如下
function onmpw_json_encode($data){ if(is_object($data)) return false; if(is_array($data)){ $data = deal_array($data); } return urldecode(json_encode($data));}function deal_array($data){ if (is_array($data)) { foreach ($data as $key => $val) { if (is_array($val)) { //如果是多維數組,通過遞歸來處理多維數組 $data[$key] = deal_array($val); } else { //對值進行url編碼 $data[$key] = urlencode($val); } } } elseif (is_string($data)) { $data = urlencode($data); } return $data;}下面我們來看一個使用示例$data = array( array('id'=>1,'name'=>'跡憶博客','parid'=>0), array('id'=>2,'name'=>'學無止境','parid'=>1), array('id'=>3,'name'=>'趣味雜談','parid'=>1), array('id'=>4,'name'=>'編程語言','parid'=>2), array('id'=>5,'name'=>'網絡','parid'=>2), array('id'=>6,'name'=>'算法','parid'=>2), array('id'=>7,'name'=>'操作系統','parid'=>2), array('id'=>8,'name'=>'數據庫','parid'=>2), array('id'=>9,'name'=>'web前端','parid'=>2), array('id'=>10,'name'=>'讀書','parid'=>3), array('id'=>11,'name'=>'觀點與感想','parid'=>3) );$data = onmpw_json_encode($data);echo $data;
現在我們有了想要的結果
[{id:1,name:跡憶博客,parid:0},{id:2,name:學無止境,parid:1},{id:3,name:趣味雜談,parid:1},{id:4,name:編程語言,parid:2},{id:5,name:網絡,parid:2},{id:6,name:算法,parid:2},{id:7,name:操作系統,parid:2},{id:8,name:數據庫,parid:2},{id:9,name:web前端,parid:2}, {id:10,name:讀書,parid:3},{id:11,name:觀點與感想,parid:3}]
中文編碼問題非常普遍,我們都需要根據實際情況進行更多總結。您可以輕松解決將來的開發中的類似問題。
對于上面的自定義json_encode函數,我將其封裝在一個公共類中。源代碼在github上,我將繼續將一些常用功能封裝到該公共類中。歡迎下載。希望這對大家有幫助。
混合云將在企業級云計算市場“唱主角”上海網站制作公司建站注重用戶體驗網站做百度優化應該從哪幾個方面入手呢?網站營銷是什么?網站營銷怎么做?重慶小型的企業網站如何策劃設計7點公司網站開發后要索取源文件網站定位越精準用戶就越喜歡動態DNS是什么?DDNS是怎么工作的?