前言:
- request.setCharacterEncoding只能对POST请求有效。对GET请求无效。
- request.getParameter获取参数,与SpringMVC参数绑定效果等同。
- request.getParameter中使用了Tomcat的server.xml配置的属性URIEncoding,来解码参数。
- 使用url拼接中文,不会进行任何编码
- 使用ajax请求发送中文参数,会进行一次编码(即如果参数值为中文,会进行UTF-8编码)
- 对中文UTF-8编码后再进行任何编码,都只会在原%与两位十六进制数之间添加'25'
解决:
方式一:
//前端
var param = {
name : '中文'
};
$.getJSON('/test',param);
@RequestMapping("test")
public void test(String name){
name = new String(name.getBytes("iso-8859-1"),"utf-8");
}
方式一过程分析:
String a = "中文";
a = URLEncoder.encode(a,"utf-8"); //第一次编码
System.out.println(a); //%E4%B8%AD%E6%96%87
//未配置URLEncoding,使用默认的iso-8859-1来解码
a = URLDecoder.decode(a,"iso-8859-1");
System.out.println(a); //䏿
String b = new String(a.getBytes("iso-8859-1"),"utf-8");
System.out.println(b); //中文
方式一弊端:
String a = "中文";
a = URLEncoder.encode(a,"utf-8");
System.out.println(a); //%E4%B8%AD%E6%96%87
//如果配置了URLEncoding为utf-8
a = URLDecoder.decode(a,"utf-8");
System.out.println(a); //中文
String b = new String(a.getBytes("iso-8859-1"),"utf-8");
System.out.println(b); //??
方式二:
//server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
//前端
var param = {
name : '中文'
};
$.getJSON('/test',param);
@RequestMapping("test")
public void test(String name){
//name直接可用
}
方式二过程分析:
String a = "中文";
a = URLEncoder.encode(a,"utf-8"); //第一次编码
System.out.println(a); //%E4%B8%AD%E6%96%87
//配置URLEncoding为utf-8
a = URLDecoder.decode(a,"utf-8");
System.out.println(a); //中文
方式二弊端:
String a = "中文";
a = URLEncoder.encode(a,"utf-8"); //第一次编码
System.out.println(a); //%E4%B8%AD%E6%96%87
//配置URLEncoding为gbk
a = URLDecoder.decode(a,"gbk");
System.out.println(a); //涓枃
方式三:
//前端
var name = encodeURI('中文');
var param = {
name : name
};
$.getJSON('/test',param);
@RequestMapping("test")
public void test(String name){
name = URLDecoder.decode(name, "utf-8");
}
方式三过程分析:
String a = "中文";
a = URLEncoder.encode(a,"utf-8"); //第一次编码
System.out.println(a); //%E4%B8%AD%E6%96%87
a = URLEncoder.encode(a,"iso-8859-1"); //第二次编码
System.out.println(a); //%25E4%25B8%25AD%25E6%2596%2587
//即使配置URLEncoding为GBK
a = URLDecoder.decode(a,"gbk");
System.out.println(a); //%E4%B8%AD%E6%96%87
a = URLDecoder.decode(a,"utf-8");
System.out.println(a); //中文
总结:
通过前端的两次编码,后端可以使用URLEncoder.encode来进行UTF-8解码,而不依赖服务器URLEncoding 的配置。