ajax请求使用utf-8,Ajax发送请求时的编码问题

对于我们大多数做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将直接使用服务器上次的缓存,不会重新发送请求,这对于自动刷新页面相当不好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值