ajax中文乱码有很多原因那么如何解决这个乱码问题呢?
很简单,使用 JS的内置函数 encodeURIComponent 对中文字符串进行转义一下就好了。关于 encodeURIComponent 函数的用法,
scape() 方法:
采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。
不会被此方法编码的字符: @ * / +
encodeURI() 方法:
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。
不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '
encodeURIComponent() 方法:
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。
不会被此方法编码的字符:! * ( ) '
因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用 escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者 encodeURIComponent。
例子
1.发送路径中的参数有中文,在服务器段接收参数值是乱码
解决办法:前端(客户端)两次编码,后端(服务器)一次解码!
前端:
代码如下 | 复制代码 |
var url="index.jsp?test=来自前台我不是乱码"; url=encodeURI(url); url=encodeURI(url); //两次编码 XMLHTTP.open ("post",url,true); 后端: String name = arg0.getParameter("test"); name = java.net.URLDecoder.decode(name, "UTF-8");//一次解码 System.out.println("前台传过来的参数:" + name);//输出结果:来自前台我不是乱码 |
2.返回来的responseText或responseXML的值中含有中文是乱码
解决办法:在后端指定发送数据的格式!
后端:
代码如下 | 复制代码 |
response.setContentType("text/xml;charset=UTF-8"); //这行放在流输出前才好使 PrintWriter out = arg1.getWriter(); String info = "来自后台我不是乱码"; out.println(info); 前端: var backInfo = XMLHttpReq.responseText;//后台返回的信息 alert(backInfo);//结果:来自后台我不是乱码 |
3.总结
1) Ajax提交数据的格式默认为utf-8,利用javascript的提供的encodeURI()方法两次编码.在服务器端接收的时候要使用java.net.URLDecoder.decode("","UTF-8")方法解码一次.
2) AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,所以服务器要向客户端发送数据的时候,也要采用utf-8编码, response.setContentType("text/xml;charset=UTF-8").
3)如果上述方法仍然解决不了乱码问题,那你尝试一下把jsp,htm,java文件用UTF-8编码格式保存.总之,前后台数据交互都采用utf-8编码就行了.
当网站已采用了诸如GBK/GB2312编码时,分两种情况:
1、Ajax发送中文字符、PHP(后台程序)进行接收发生乱码时,使用GBK与UTF8的转换函数对接受的字符串进行编码转换,再存入相关数据库,这里假设数据库采用的编码是GBK或者GB2312,如果配置的PHP运行环境支持ICONV函数,你也可使用ICONV函数进行编码转换,然后在存入数据库时
代码如下 | 复制代码 |
mysql_query("set names gb2312"); |
即可解决Ajax传值中文乱码问题。
2、PHP发送中文字符、Ajax(前台页面)进行接收发生乱码时,同样可以使用ICONV函数对从数据库中取出的字符串进行编码转换,再传值至Ajax前台,即responseText。或者在PHP(后台程序)输出字符流之前加上
代码如下 | 复制代码 |
header('Content-type: text/html;charset=gb2312'); |
即可。特别指出:在使用Ajax做多级联动(比如省份城市联动)时,采用XML交互形式,在输出XML之前也必须加上header。