对于我们大多数做web开发的人来说,在不同编码影响下,往往会出现乱码的问题,以致于最终达不到开发需求。如果发送的请求里不包含非西欧字符,将不会有任何问题;但是一旦包含了非西欧字符的请求参数,问题也就出现了,但也不一定。
现在有这样一个小demo:
show.jsp:
System.out.println(request.getParameter("name"));
%>
first.html:
// 获取xmlHttpRequest
var xmlHttp;
function getXMLHttpRequest()
{
if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}else if(window.ActiveXObject)
{
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){ }
}
}
}
function postSend(name)
{
xmlHttp = getXmlHttpRequest;
// 服务器请求url
var uri = "show.jsp";
// 使用POST方式打开与服务器的连接
xmlHttp.open("POST",uri,true); // true----指定使用异步处理
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
// 发送请求
xmlHttp.send("name="+name);
}
fucntion getSend(name)
{
xmlHttp = getXmlHttpRequest;
var uri = "show.jsp?name="+name;
xmlHttp.open("GET",uri,true);
xmlHttp.send(null);
}
当我们访问页面提交请求参数后,会在控制台看到,使用GET请求则出现了中文乱码。Ajax请求中,对于POST请求较好处理,异步POST请求参数默认采用UTF-8字符集来编码请求参数,因此只需要调用HttpServletRequest的setCharacterEncoding("utf-8");就可以解决。一般情况下,服务器页面默认采用UTF-8字符集来解码请求参数,所以有时候会看到,即使你没有设置编码字符集,也会看到正确的输出。
但是GET就有所不同,我们知道,GET将请求参数和对应的值附加在请求的URL之后。对于中文请求参数值,不会以中文的方式传递参数值,而是转码成URL的格式。所以,应当在服务器页面中作出以下修改:
if(request.getMethod().equalsIgnoreCase("POST"))
{
request.setCharacterEncoding("utf-8");
System.out.println(request.getParameter("name"));
}
// 处理GET请求
if(request.getMethod().equalsIgnoreCase("GET"))
{
String temp = reqeust.getParameter("name");
// 将参数按ISO-8859-1字符集编码成字节数组,然后按UTF-8字符集将该字节数组解码成字符串
String new_string = new String(temp.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(new_string);
}
%>
这样,或许可以看到正确的GET发送参数的输出,但是当我们换用IE浏览器发出请求时,将再次出现乱码。GET请求参数所用的字符集与客户端浏览器有关,不同的浏览器在发送GET请求时使用了不同的字符集。
所以,我们只能使用java.net.URLEncoder.encode()方法进行处理:
java.net.URLEncoder.encode(请求参数,"GBK");
然后在服务器端进行相应的转换处理:
new String(请求参数.getBytes("ISO-8859-1"),"GBK");
这样GET发送请求参数乱码问题就解决了。但是,会有相当烦琐的一系列操作,不推荐。
最好是使用POST发送请求参数,理由如下:
1 当请求参数包含的数据太多时,GET请求可能 丢失请求参数
2 当两次GET请求参数相同时,Internet Explorer将直接使用服务器上次的缓存,不会重新发送请求,这对于自动刷新页面相当不好。