为什么Form表单提交不是乱码,而ajax提交会是乱码?

sugarTan 2013-10-12 03:35:05
form表单提交就不说了,ajax提交表单:

var data = $("#myForm").serialize();
//实际上serialize()方法会将中文编码一次,提交时再用encodeURI方法将data再编码一次:
$.ajax({
async : false,
type : "post",
dataType : "json",
url : url + "&" + encodeURI(data),
contentType : "application/x-www-form-urlencoded; charset=utf-8",
success : function(result) {
reflashTable(result);
},
error : function(XMLHttpResponse) {
alert("出错了。");
}
});

服务器端:

public void setPlayername(String playername) {
try {
this.playername = playername == null ? null : java.net.URLDecoder.decode(playername.trim(), "UTF-8");
} catch (UnsupportedEncodingException e) {
System.out.println("setPlayername decode utf-8 Error!");
}
}

没错这样是能够正常显示的。
可我就搞不明白了,serialize()之后的值实际上与java.net.URLEncoder.encode()的值是相等的,如果不进行第2次编码,那么tomcat在接收时decode一次后理应是正确的值,为什么就成乱码了呢?而为什么使用form表单提交却不用encode服务器也能正确接收?
...全文
476 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sugarTan 2014-10-10
  • 打赏
  • 举报
回复
引用 楼主 tan3739 的回复:
form表单提交就不说了,ajax提交表单:

	var data = $("#myForm").serialize();
	//实际上serialize()方法会将中文编码一次,提交时再用encodeURI方法将data再编码一次:
	$.ajax({
		async : false,
		type : "post",
		dataType : "json",
		url : url + "&" + encodeURI(data),
		contentType : "application/x-www-form-urlencoded; charset=utf-8",
		success : function(result) {
			reflashTable(result);
		},
		error : function(XMLHttpResponse) {
			alert("出错了。");
		}
	});
服务器端:

	public void setPlayername(String playername) {
		try {
			this.playername = playername == null ? null : java.net.URLDecoder.decode(playername.trim(), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			System.out.println("setPlayername decode utf-8 Error!");
		}
    }
没错这样是能够正常显示的。 可我就搞不明白了,serialize()之后的值实际上与java.net.URLEncoder.encode()的值是相等的,如果不进行第2次编码,那么tomcat在接收时decode一次后理应是正确的值,为什么就成乱码了呢?而为什么使用form表单提交却不用encode服务器也能正确接收?
按上面应该是可以的,我没去试试。 var data = $("#form").serialize(); 这个只是把Form值取出来而以,如:playerid=1234&age=20&nickname=Hello&realname=1233中国 我就自己修改了data的值,编码一下: data = encodes(data,"nickname,realname"); /** encodes方法 */ function encodes(data, names) { names = names.split(","); for (var i=0; i<names.length; i++) { if (names[i] != "" && names[i] != null) { var start = data.indexOf(names[i]); var endStr = data.substring(start); var end = endStr.indexOf("&"); if (end == -1) end = endStr.length; var mid=endStr.indexOf("=")+1; var value=endStr.substring(mid, end); //var nameValue = endStr.substring(0, end); var nameValue = names[i] + "=" + value; nameValue = encodeURI(nameValue); data = data.substring(0,start)+nameValue+endStr.substring(end); } else { alert(names[i] + "为空"); } } return data; } 这样也已经把问题解决了。其实这些是JQuery 早就帮我们做好了吧。。。。。。
别闹腰不好 2013-11-14
  • 打赏
  • 举报
回复
表单以ajax提交 ,jquery中form 插件,比这个好用
Go 旅城通票 2013-11-14
  • 打赏
  • 举报
回复
你应该去java版块问,服务器接收数据后是否已经解码过一次什么的
zhengwenlan 2013-11-14
  • 打赏
  • 举报
回复
使用data传数据嘛 url:"../ajax/manage.asp?action=checkEmailOnly", data:{"email":email}, type:"post", dataType:"json",
未知数 2013-11-14
  • 打赏
  • 举报
回复
你把参数放url中,那post提交还有什么意义?url传参中文是必须进行url编码的,不然serialize函数吃多了给你编码一次?但你又把它解析成中文,然后放在url中它还得又编码一次,有多纠结我就不说了 你把参数做成一个对象放data配置中就行了,很简单,对form中的input做一次遍历就行了

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧