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

来源:互联网 发布:小猪cms 微盟 编辑:程序博客网 时间:2024/05/16 04:53

前段时间写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="提交" onclick="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="提交" onclick="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的差不多,都是在客户端编码两次,在服务器端解码一次。以上方法是我总结网上的方法和自己的研究写出来的,如果朋友你有更加好的方法请指教。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 按揭车押金不退怎么办 护照到期韩国签证没到期怎么办 日本签证银行流水不够怎么办 想去日本cm签证怎么办 护照在签让那里怎么办 泰国出境单丢了怎么办 居住证到期了忘记续签了怎么办 贵州交警app忘记密码怎么办 科一第一次没过怎么办 社保转移时学历信息不符怎么办 天津摇号密码忘了怎么办 摇号账号密码忘了怎么办 京牌车去外地没有保险标怎么办 车子被扣12分怎么办 不在北京工作了社保怎么办 5年身份证到期了怎么办 c1驾照剩1分怎么办 c1驾校扣12分怎么办 我驾照扣了12分怎么办 小米手环绑定不了怎么办 小区总有小年青骑摩托车扰民怎么办 摩托车行驶证副本丢了怎么办 摩托车驾照副本丢了怎么办 公司行驶证掉了怎么办 身份证外迁了过户的话怎么办 驾照体检报告丢了怎么办 常州医保卡丢了怎么办 驾驶证违章罚单丢了怎么办 身份证被别人办了信用卡怎么办 被别人办了信用卡怎么办 考驾照体检忘带身份证怎么办 c证扣12分怎么办新规 c照12分不够扣怎么办 扣了18分怎么办一次性 c照累计扣12分怎么办 车辆超速扣12分怎么办 一次超速扣12分怎么办 分扣了罚款未交怎么办 c照一次扣12分怎么办 人在外地身份证到期了怎么办 手机进水了屏幕不亮怎么办