在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;$istrlen($utf8);$i+=3)
$ret.=chr(substr($utf8,$i,3));
return
$ret;
}
function u2utf8($c)
{
for($i=0;$icount($c);$i++)
$str="";
if
($c
0x80)
{
$str.=$c;
}
else
if
($c
0x800)
{
$str.=(0xC0
$c>>6);
$str.=(0x80
$c
&
0x3F);
}
else
if
($c
0x10000)
{
$str.=(0xE0
$c>>12);
$str.=(0x80
$c>>6
&
0x3F);
$str.=(0x80
$c
&
0x3F);
}
else
if
($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版权所有,转载时请以链接形式注明原始出处及本声明,谢谢。