因为XMLHttp在处理返回的responstText的时候把responstBody按UTF-8编码进行解码的,如果服务器端送出的数据流的确是UTF-8编码,那么中文字就会正确显示,但如果是GBK或是其他编码则会出现上述情况。
AJAX的中文乱码可以大概分为两中,第一种是向服务器端发送中文参数时(xmlhttp.open(“get|post”,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的值有可能为乱码。
ajax乱码解决办法一:
在服务器指定发送数据的格式:
在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”); |
ajax乱码解决方法二:
PHP发送中文、Ajax接收
只需在php顶部加入一句:
代码如下 | 复制代码 |
header(‘Content-type: text/html;charset=GB2312′); |
xmlHttp会正确解析其中的中文。
Ajax发送中文、PHP接收
这个比较复杂:
Ajax中先用encodeURIComponent对要提交的中文进行编码
PHP中:
代码如下 | 复制代码 |
$GB2312string=iconv( ‘UTF-8′, ‘gb2312//IGNORE’ , $RequestAjaxString); PHP写入MySQL数据库 建立conn时,query一下set names “gb2312″ |
==================================================
注意红色部分!!!否则无法使用!!!具体原因自己猜!
代码如下 | 复制代码 |
iconv( “UTF-8″,”GBK” , $gametypes["name"]); |
原创:
我的乱码问题是AJAX取数据时产生乱码,本来页面是采用GBK编码的。后来显示为乱码,我使用UE把它转换成UTF-8后,
页面上原来的元素就可以显示正确了。但是,数据库取出来的值还是会乱码。
ob_get_contents ();
取出所有的显示数据,然后输出到日志文件,显示全是乱码。
使用UE把文件再转换成GBK,然后再输出,显示就正确了。
这里再使用:
代码如下 | 复制代码 |
header(‘Content-Type:text/html;charset=GBK’); |
前台页面显示就正常。
说了这么多我们来看实例
例如:
代码如下 | 复制代码 |
var url="a.jsp?name=小李"; xmlHTTP.open ("post",url,true); |
解决办法:
利用javascript的提供的escape()或encodeURI()方法
例如:
客户端:
代码如下 | 复制代码 |
var url="a.jsp?name=小李"; url=encodeURI(url); url=encodeURI(url); //两次,很关键[具体为什么,我也不清楚] /********************************************/ 也有人写成var url="a.jsp?name=escape("小李")"; 功能和encodeURI方法类似。 /********************************************/ |
服务器端:
代码如下 | 复制代码 |
String name = request.getParameter("name"); name = java.net.URLDecoder.decode("name", "UTF-8"); |
总结了一下最简单的方法就是页面和请求返回的页面编码一致就好了
解决AJAX中文回传乱码,其实就是将在服务器端文件加一个HEADER,指明送出的是什么编码流。比如
ASP文档就是在头部增加一行说明:
代码如下 | 复制代码 |
Response.Charset("GB2312") |
PHP的示例如下:
代码如下 | 复制代码 |
header('Content-Type:text/html;charset=GB2312'); |
JSP的如下:
代码如下 | 复制代码 |
response.setHeader("Charset","GB2312"); |