在学习ajax中XMLHttpRequest对象扩展问题中,XMLHttpRequest可以用来解决web访问中文乱码问题,对此作出总结。
出现乱码的原因:
(1)请求数据中包含中文,服务器端程序接受错误导致乱码。
(2)响应数据中包含中文,编码设置错误导致浏览器中看到的结果是乱码
不论是请求数据还是响应数据,乱码的根源在于设置对外部脚本文件的编码方式,即charset,默认的charset属性是“ISO-8859-1”。
解决方案:
一、响应数据乱码
保证页面端定义的charset和http响应头的Content-Type中定义的charset一致即可。
特例:IE6中XMLHttpRequest对象在页面端和http响应头的Content-Type中定义的charset都为GB2312时,中文响应数据出现乱码。解决办法:
(1)http响应头的Content-Type中charset设置为utf-8
(2)仅仅使用”MSXML2.XMLHTTP”,”Microsoft.XMLHTTP”这两个中的一个来创建XMLHttpRequest对象。代码如下:
var activexName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"]; //将其中的对象减少为这两个
for (var i=0; i<activexName.length; i++ ){
try{
var xmlhttp = new ActiveXObject(activexName[i]);
break;
} catch(e) {
}
二、请求数据乱码
分别从页面端和服务器端着手:
页面端:利用javascript中的encodeURI进行两次编码处理
服务器端:获取到的请求数据通过URLDecode类的decode方法按照utf-8的方式进行decode解码处理。
代码如下:
页面端:
//回调方法代码
xmlhttp.onreadystatechange = callback;
//记忆一个固定用法,获取文本框中用户输入的内容
var userName = document.getElementById("UserName").value;
//两次encodeURI编码
username = encodeURI(encodeURI(userName));
服务器端:
Protected void processRequest(HttpServletRequest request, HttpServletResponse response)
Throws ServletException, IOException {
response.setContentType("text/html;charset = utf-8");
printWriter out = response.getWriter();
try{
String old = request.getParameter("name");
If(old == null) {
out.println(“用户名不能为空”);
<span style="white-space:pre"></span> } else {
<span style="white-space:pre"></span> String name = URLDecoder.decode(old,”utf-8”);
System.out.println(name);
If(name.equals(“zzh”)) {
out.println(“用户名[” + name + “]已经存在,请使用其他用户名”);
} else{
out.println(“用户名[” + name + “]尚未存在,可以使用该用户名”)
}
}
} finally {
<span style="white-space:pre"></span> out.close();
}
}
问题解决原理:
即通过encodeURI和URLDecode使得请求中文字符不出现乱码。 综上所述,在XMLHttpRequest使用的5个步骤中添加代码则可以实现解决中文乱码的问题。