在PHP網站開發中,為了增加使用者體驗度,Ajax是一種經常使用的技術,但是對於初學者來說,時常會碰到Ajax傳值中文字串時變成亂碼的問題,有什麼辦法可以解決PHP AJAX傳值中文字元亂碼的問題呢?
我們知道Ajax技術由Javascript演變而來,而Javascript使用UTF-8編碼,當前後台頁面採用GBK或者其他編碼,同時沒有進行編碼轉換時,就會出現中文字元亂碼問題。
PHP Ajax傳值中文字元亂碼解決方案
方法一、前後台頁面以及資料庫統一採用UTF8編碼,這是最簡單的方法。
方法二、當網站已採用了諸如GBK/GB2312編碼時,分兩種情況:
1、Ajax發送中文字元、PHP(背景程式)進行接收發生亂碼時,使用GBK與UTF8的轉換函式對接受的字串進行編碼轉換,再存入相關資料庫,這裡假設資料庫採用的編碼是GBK或者GB2312,如果配置的PHP運行環境支援ICONV函數,你也可使用ICONV函數進行編碼轉換,然後在存入資料庫時
1
|
mysql_query("set names gb2312"); |
即可解決Ajax傳值中文亂碼問題。
2、PHP發送中文字元、Ajax(前台頁面)進行接收發生亂碼時,同樣可以使用ICONV函數對從資料庫中取出的字串進行編碼轉換,再傳值至Ajax前台,即responseText。或者在PHP(背景程式)輸出字元流之前加上
1
|
header('Content-type: text/html;charset=gb2312'); |
即可。特別指出:在使用Ajax做多級聯動(比如省份城市聯動)時,採用XML互動形式,在輸出XML之前也必須加上header。
同時貼出GB2312與UTF8的轉換函式,方便大家在遇到Ajax中文亂碼問題時多一種解決方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
function gb2utf8($gb,$filename) { if(!trim($gb)) return$gb; //$filename="gb2312.txt"; $tmp=file($filename); $codetable=array(); while(list($key,$value)=each($tmp)) $codetable[hexdec(substr($value,0,6))]=substr($value,7,6); $utf8=""; while($gb) { if(ord(substr($gb,0,1))>127) { $thisgb=substr($gb,0,2); $gb=substr($gb,2,strlen($gb)); $utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($thisgb))-0x8080])); } else { $gb=substr($gb,1,strlen($gb)); $utf8.=u2utf8(substr($gb,0,1)); } } $ret=""; for($i=0;$i<strlen($utf8);$i+=3) $ret.=chr(substr($utf8,$i,3)); return$ret; }
function u2utf8($c) { for($i=0;$i<count($c);$i++) $str=""; if($c<0x80){ $str.=$c; } elseif($c<0x800){ $str.=(0xC0$c>>6); $str.=(0x80$c&0x3F); } elseif($c<0x10000){ $str.=(0xE0$c>>12); $str.=(0x80$c>>6&0x3F); $str.=(0x80$c&0x3F); } elseif($c<0x200000){ $str.=(0xF0$c>>18); $str.=(0x80$c>>12&0x3F); $str.=(0x80$c>>6&0x3F); $str.=(0x80$c&0x3F); } return$str; } |
注:此函數需要使用GB2312中文編碼錶,請點擊這裡下載,由於是採用gb2312,對於一些比較生僻的詞在轉換時可能會出現亂碼。
注:PHP網站開發教程-leapsoul.cn著作權,轉載時請以連結形式註明原始出處及本聲明,謝謝。