如何解决get请求URL地址的中文参数问题

首先我们要明白为什么在get请求URL地址出现中文参数会乱码,这是因为页面发出请求的编码和tomcat获取数据的编码不一致造成的。
在解决这个问题之前,我们得先了解一些知识:
1.request.setCharacterEncoding("utf-8")方法只对post请求有效。
2.get、post请求的url编码由标签,<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">设定,<%@page language="java" import="java.util.*"pageEncoding="utf-8"%>标签表示页面实现的编码。
3.了解js的encodeURI( URI)方法:把字符串作为 URI 进行编码。注意该方法不会对 ASCII字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ),该方法的目的是对 URI进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI()函数是不会进行转义的:;/?:@&=+$,#。
4.URLDecoder.decode(String s, Stringencode)将字符串按encode编码进行解码。

了解以上内容后,我们现在开始解决问题:
1.在jsp中对请求地址进行编码,代码如下:
function link(){
    var uri =encodeURI("test?name=李四");
    uri =encodeURI(uri);
   location.href = uri;
 }
2.在servlet中对参数进行解码,代码如下:
String name = request.getParameter("name");
System.out.println(URLDecoder.decode(name, "utf-8"));
运行程序,在jsp页面点击按钮触发link事件,控制台输出 李四,有人会问了为什么要进行两次编码,这是因为执行request.getParameter("name"),tomcat会自动解码,默认编码为iso-8859-1,iso-8859-1无法识别中文,如果只编码一次,会用iso-8859-1解码utf-8的编码,控制台会输出??????,因为utf-8编码的一个汉字是3个字节,所有是6个问号。看到这里,有的人就会想为什么不设置tomcat的编码为utf-8,现在我们试试,测试如下:
1.打开conf目录下的server.xml,
在<Connector port="2013" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"/>
标签内添加URIEncoding="utf-8"。
2.jsp中代码修改为:
function link(){
   location.href = "test?name=李四";
 }
3.servlet中代码修改为:
System.out.println(request.getParameter("name"));
结果仍是 李四,这里可以看出,只要前后2次编码一致,就不会出现乱码。
有的人说我既不想修改tomcat编码,也不想对请求地址编码,那么怎么办,只需将servlet修改为
String name = request.getParameter("name");
System.out.println(newString(name.getBytes("iso-8859-1"),"utf-8"));
结果还是 李四,这就是上面说的,只要前后编码一致,就不会出现乱码。但是这种方式一般不推荐。
在写程序中,一定要将项目编码、页面编码、后台编码、数据库编码等等设为一致,一般采用utf-8编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值