Ajax使用POST提交中文乱码问题

前段时间写JSP,使用AJAX以POST方式提交数据,如果是中文字符提交就会乱码,后来写ASP时用到AJAX以POST方式提交数据,中文一样是乱码。搜索一下相关资料,问题应该是提交数据时是以UTF-8编码提交,所以接收时如果使用GB2312或者其它中文编码的话就会乱码。

使用GET方式提交数据的时候,中文问题很好解决,setRequestHeader("Content-Type","text/html;encoding=gb18030")就可以了。但这个方法在POST方式中却不起作用。大家都知道GET方式提交数据有长度限制,有时我们必须使用POST方式来提交数据。

对于使用POST,
JSP的解决方法如下
使用escape(或encodeURI,两个函数都是JavaScript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这个是关键。

初始页面内容如下(hello.jsp):
<%@ page language="java" import="java.util.*"pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>AJAX提交页面</title>
<metahttp-equiv="Content-Type" content="text/html; charset=GB18030">
<scripttype="text/javascript">
function justdo(){
    var post ="name=王力猛&email=wallimn@sohu.com&bokee=http://wallimn.bokee.com";
   post = encodeURI(post);
    post = encodeURI(post);    //两次,很关键
    var xmlObj = newActiveXObject("Msxml2.XMLHTTP");
    var URL = "act.jsp";   //文件名需要调整成测试时的相应位置
    xmlObj.open("POST",URL,true);
   xmlObj.setRequestHeader("Cache-Control","no-cache");
   xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
   xmlObj.send(post);   //注意:POST方式,使用这个来发送内容
}
</script>
</head>
<body>
<input type="button" value="提交" οnclick="justdo()"/>
</body>
</html>



Ajax请求处理页面(act.jsp)的内容如下:
<%@ page language="java" import="java.util.*"pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<%@pageimport="java.net.URLDecoder"%>
<html>
<head>
<title>ajaxdeal</title>
<meta http-equiv="pragma"content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
</head>
<body>
<%
//遍历输出参数内容。
for(Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
   String h = (String)e.nextElement();
    String v =request.getParameter(h);
    String mm = java.net.URLDecoder.decode(v, "UTF-8");
   System.out.println("请求参数: " + h + " = " +mm);
}
%>
</body>
</html>


分析:当调用request.getParameter()函数时,会自动进行一次URI的解码过程,调用时内置的解码过程会导致乱码出现。而URI编码两次后,request.getParameter()函数得到的是原信息URI编码一次的内容。再用可控的解码函数java.net.URLDecoder.decode()就可解出原始的正确的信息。


对于ASP,可以在客户端使用JavaScript的encodeURIComponent函数(其它编码函数可能也行,没有试)编码两次,然后ASP使用Request.Form接收后使用JavaScript的decodeURIComponent解码一次:

初始页面内容如下(hello.asp):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>AJAX提交页面</title>
<metahttp-equiv="Content-Type" content="text/html; charset=GB2312">
<scripttype="text/javascript">
function justdo(){
    var post = "name=" +
encodeURIComponent( encodeURIComponent(" 王力猛 ") );    //两次
    var xmlObj =new ActiveXObject("Msxml2.XMLHTTP");
    var URL = "act.asp";   //文件名需要调整成测试时的相应位置
    xmlObj.open("POST",URL,true);
   xmlObj.setRequestHeader("Cache-Control","no-cache");
   xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
   xmlObj.send(post);   //注意:POST方式,使用这个来发送内容
}
</script>
</head>
<body>
<inputtype="button" value="提交" οnclick="justdo()"/>
</body>
</html>


Ajax请求处理页面(act.asp)的内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>ajaxdeal</title>
<meta http-equiv="pragma"content="no-cache">
<meta http-equiv="cache-control"content="no-cache">
<meta http-equiv="expires"content="0">
</head>
<body>
<%
Dimcontext
context = decodeText(Request.Form("name"))
Response.Write("name="& context)
%>
</body>
</html>

<script language="javascript" runat="server">
functiondecodeText(str){
    return (str == null ? "" :decodeURIComponent(str));
}
</script>


ASP处理的原理跟JSP的差不多,都是在客户端编码两次,在服务器端解码一次。以上方法是我总结网上的方法和自己的研究写出来的,如果朋友你有更加好的方法请指教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值