为什么Form表单提交不是乱码,而ajax提交会是乱码
1个回答
2017-07-07
展开全部
form表单提交就不说了,ajax提交表单:
JavaScript code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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("出错了。");
}
});
服务器端:
Java code
?
1
2
3
4
5
6
7
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 早就帮我们做好了吧。。。。。
JavaScript code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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("出错了。");
}
});
服务器端:
Java code
?
1
2
3
4
5
6
7
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 早就帮我们做好了吧。。。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询