对于咱们大多数作web开发的人来讲,在不一样编码影响下,每每会出现乱码的问题,以至于最终达不到开发需求。若是发送的请求里不包含非西欧字符,将不会有任何问题;可是一旦包含了非西欧字符的请求参数,问题也就出现了,但也不必定。 javascript
如今有这样一个小demo: html
show.jsp: java
<% @ page contentType="text/html;charset=GBK" language="java" %> web
<% // 服务器从页面获取用户的name请求参数,在控制台输出 数组
System.out.println(request.getParameter("name")); 浏览器
%> 缓存
first.html: 服务器
<input type="text" id="test" name="name"><br /> app
<input type="button" value="GET发送" onclick='getSend(document.getElementById("test").value)' /> 异步
<input type="button" value="POST发送" onclick='postSend(document.getElementById("test").value)' />
<script type=javascript>
// 获取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);
}
</script>
当咱们访问页面提交请求参数后,会在控制台看到,使用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将直接使用服务器上次的缓存,不会从新发送请求,这对于自动刷新页面至关很差。