GET请求传输中文

前言:

  • 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 的配置。

转载于:https://my.oschina.net/marvelcode/blog/1476429

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值