AJAX中文乱码PHP中完美解决方法
程序员文章站
2022-07-02 16:16:53
最近在做一个项目,遇到ajax中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助。 众所周知,使用ajax传送...
最近在做一个项目,遇到ajax中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助。
众所周知,使用ajax传送和接收中文参数时,如果不在客户端和服务器做相应的处理就会出现乱码问题,在网上相应的文章也不少,但是有的情况下很难从中找到符合自己理想的答案,我今天就是在网上找了很多,但是都差不多,讲asp和jsp的比较多(我是用的php),所以到最后都没找到自己满意的答案。
ajax的中文乱码可以大概分为两中,第一种是向服务器端发送中文参数时(xmlhttp.open(“getpost”,url,true)),服务器端接收到的为乱码,这个也是我今天遇到的问题,没做处理之前,在ie里是正常的,但是在firefox里面就出现了乱码,我先把接收到参数输出到一个文本里,没有发现什么问题,郁闷了,然后我就把查询语句在输出来观察(我这里是要从数据库里查出与参数相关的东西),终于发现问题,ie和firefox输出的参数不一样,虽然汉字上都一样,但是和前后连接上有细小的区别,于是认定了是编码问题,在网上查找了相关资料,都没能解决问题,但是得到一些启示,因为ajax发送数据都是采用utf-8编码的方式发送的,所以要在服务器端进行编码转换(我这里页面是采用gb2312编码的,如果是采用utf-8的话应该不会有这步的问题),所以我在服务器端进行了utf-8转gb2312,
$str=iconv("utf-8","gb2312",$str);
然后测试,在firefox上顺利解决了问题,以为大公告成了,可是再到ie下测试,发现ie又出现了问题,服务器端接收到的参数没值,这下就郁闷了,突然看到发送头设置了setrequestheader("content-type","application/x-www-form-urlencoded");,就找到问题所在了,然后就在发送那里进行了参数编码:
geturl=encodeuri(geturl);
geturl=encodeuri(geturl); //两次也可以写成geturl=encodeuri(encodeuri(geturl));
xmlhttp.open("get",geturl,true);
然后再到服务器端进行url解码:
$str=urldecode($str); //解码
$ str =iconv("utf-8","gb2312",$ str); //编码转换
注意:解码必须在编码转换前面,不然得不到正确值
保存测试,ie和firefox都能正常了。
第二种就是服务器端向客户端输出中文时出现乱码,这类问题网上的答案就比较多了,也都能解决,为了避免各位再去查找,我在这里就copy下j
原因:ajax在接收responsetext或responsexml的值的时候是按照utf-8的格式来解码的,如果服务器段发送的数据不是utf-8的格式,那么接收responsetext或responsexml的值有可能为乱码。
解决办法:
在服务器指定发送数据的格式:
在jsp文件中:
response.setcontenttype("text/text;charset=utf-8");//返回的是txt文本文件
或是
response.setcontenttype("text/xml;charset=utf-8");//返回的xml文件
php:header('content-type:text/html;charset=gb2312');
asp:response.charset("gb2312")
jsp:response.setheader("charset","gb2312");
众所周知,使用ajax传送和接收中文参数时,如果不在客户端和服务器做相应的处理就会出现乱码问题,在网上相应的文章也不少,但是有的情况下很难从中找到符合自己理想的答案,我今天就是在网上找了很多,但是都差不多,讲asp和jsp的比较多(我是用的php),所以到最后都没找到自己满意的答案。
ajax的中文乱码可以大概分为两中,第一种是向服务器端发送中文参数时(xmlhttp.open(“getpost”,url,true)),服务器端接收到的为乱码,这个也是我今天遇到的问题,没做处理之前,在ie里是正常的,但是在firefox里面就出现了乱码,我先把接收到参数输出到一个文本里,没有发现什么问题,郁闷了,然后我就把查询语句在输出来观察(我这里是要从数据库里查出与参数相关的东西),终于发现问题,ie和firefox输出的参数不一样,虽然汉字上都一样,但是和前后连接上有细小的区别,于是认定了是编码问题,在网上查找了相关资料,都没能解决问题,但是得到一些启示,因为ajax发送数据都是采用utf-8编码的方式发送的,所以要在服务器端进行编码转换(我这里页面是采用gb2312编码的,如果是采用utf-8的话应该不会有这步的问题),所以我在服务器端进行了utf-8转gb2312,
$str=iconv("utf-8","gb2312",$str);
然后测试,在firefox上顺利解决了问题,以为大公告成了,可是再到ie下测试,发现ie又出现了问题,服务器端接收到的参数没值,这下就郁闷了,突然看到发送头设置了setrequestheader("content-type","application/x-www-form-urlencoded");,就找到问题所在了,然后就在发送那里进行了参数编码:
复制代码 代码如下:
geturl=encodeuri(geturl);
geturl=encodeuri(geturl); //两次也可以写成geturl=encodeuri(encodeuri(geturl));
xmlhttp.open("get",geturl,true);
然后再到服务器端进行url解码:
复制代码 代码如下:
$str=urldecode($str); //解码
$ str =iconv("utf-8","gb2312",$ str); //编码转换
注意:解码必须在编码转换前面,不然得不到正确值
保存测试,ie和firefox都能正常了。
第二种就是服务器端向客户端输出中文时出现乱码,这类问题网上的答案就比较多了,也都能解决,为了避免各位再去查找,我在这里就copy下j
原因:ajax在接收responsetext或responsexml的值的时候是按照utf-8的格式来解码的,如果服务器段发送的数据不是utf-8的格式,那么接收responsetext或responsexml的值有可能为乱码。
解决办法:
在服务器指定发送数据的格式:
在jsp文件中:
response.setcontenttype("text/text;charset=utf-8");//返回的是txt文本文件
或是
response.setcontenttype("text/xml;charset=utf-8");//返回的xml文件
php:header('content-type:text/html;charset=gb2312');
asp:response.charset("gb2312")
jsp:response.setheader("charset","gb2312");
上一篇: 好用的AJAX类代码分享
下一篇: Ajax读取数据之分页显示篇实现代码