servlet web 乱码问题透彻解决

(1)今天被servlet乱码搞崩,是get请求,url中有中文时候,出现乱码,获取正确中文的方法如下,首先,浏览器的文本编码调成utf-8

java代码的书写方式有两种,第一种方法:

servlet的get函数写如下:

response.setCharacterEncoding("UTF-8");
String name = null;
name = request.getParameter("name").toString();
System.out.println("原始name  "+name);
String finalname = new String(name.getBytes("iso8859-1"),"utf-8");

tomcat server.xml 加上  URIEncoding="iso8859-1"  ,注意这里,可以utf-8,不可以可以gbk(稍后解释)

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="iso8859-1"/>

第二种方法:servlet的get函数写如下:

String qurryStr = request.getQueryString();
String queryNew = java.net.URLDecoder.decode(qurryStr, "UTF-8");//解码
out.println(queryNew);


(2)解释,http的get请求经过的过程为,

1.浏览器把url编码(重点)

2.url传递给web服务器,web服务器进行解码(重点),web回传的数据

3.浏览器显示回传的数据

第一个步骤,浏览器一般用utf-8编码,第二步骤,web服务器解码可以设置,就是第一步中的改server,URIEncoding="iso8859-1" 这个字段是什么,服务器就用什么解码

想要回传的数据是通过http的,所以代码response.setCharacterEncoding("UTF-8"); 设置响应编码。第三个步骤,web回传什么编码的数据,浏览器就显示什么编码的数据,本例用的utf-8


(3)为什么不能用web服务器用gbk解码

 因为gbk是2字节表示一个中文,utf-8是三个字节,iso8859-1是改版的AUSCII码,是一个字节,所以如果web服务器用gbk解码utf-8编码点url,就有可能出现数据丢失,比如url传来一个汉字‘中’,utf-8用两个三节编码表示的,gbk用2字节去解码,不匹配,漏掉了信息,或者加上了冗余信息(未具体测试)。"iso8859-1" 默认是一个字节,无所谓,一定匹配。

(4)tomcat默认用utf-8解码,我用的tomcat 8

(5)‘中文’两个字的utf-8编码是‘%E4%B8%AD%E6%96%87’,url中输入这两个字后,浏览器去编码,一般默认用utf-8,则url变成了 http://localhost:8080/..........name=%E4%B8%AD%E6%96%87   的形式,传给服务器,tomcat服务器如果用utf-8解码,则request.getParameter("name"),获取到的就是‘中文’

    这两个字。如果用utf-8或iso8859-1解码,就把%E4%B8%AD%E6%96%87 这个字串解错了,解码成了像‘綺””�‹綺�Œˆ–€…綺””’这种的乱码,则request.getParameter("name")得到的     就是解错后的乱码,解决这个问题的方法就是先按照iso8859-1编码,再按照utf-8解码,对应的语句就是

    String finalname = new String(name.getBytes("iso8859-1"),"utf-8");这样得到的字符串就是正确的中文了。
(6)servlet代码的第二种,没有改server.xml,因为String qurryStr = request.getQueryString();代码读的url中原始的信息,没有经过tomcat去解码,所以读到之后,
    String queryNew = java.net.URLDecoder.decode(qurryStr, "UTF-8");直接解码即可。

(7)Done.










评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值