requset.setCharacterEncodingt()乱码问题

一、request.setCharacterEncoding():用来确保发往服务器的参数以汉字的编码来提取,设置从request中取得的值或从数据库中取出的值。

指定后可以通过request.getParameter()获取自己想要的字符串,如果没有提前指定,则会按照服务器端默认的“iso-8859-1”来进行编码;该方法只对post请求有效,对get请求无效;对于get请求,应该在server.xml中指定:URIEncoding=utf-8

注意:在执行request.setCharacterEncoding()之前不能执行request.getParameter()方法;

原因:应该是在执行第一个getParameter()的时候,Java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。

二、response.setCharacterEncoding():设置HTTP 响应的编码,用于设置服务器给客户端的数据的编码

一般不会用这个方法来设置响应编码,

一般使用response.setContentType()方法来设置HTTP 响应的编码同时指定了浏览器显示的编码;

因为他在执行该方法通知服务器端以指定编码进行编码后,会自动调用response.setCharacterEncoding()方法来通知浏览器以指定编码来解码;使用此方法要在response.getWriter()执行之前或response提交之前;


再 明确一点: 字节流<------>字符流 的相互转换  ,例如: 

                   
Java代码  收藏代码
  1. String s = "中文";  
  2.     byte[] bs2 = s.getBytes("utf-8");  
  3.     String s1 = new String(bs2,"iso-8859-1");  
  4.     String s2 = new String(bs2,"utf-8");  
  5.     String s3 = new String(s1.getBytes("iso-8859-1"),"utf-8");  
  6.     System.out.println(s1+"\n"+s2+"\n"+s3);  
              输出结果: 
                   
Java代码  收藏代码
  1. ??????  
  2. 中文  
  3. 中文  


以下适合POST 提交以上例子说明 两点: 
1、字节流到字符流的 正向和反向 的编码格式要一致,才能正确转换,否则只会得到乱码。2、s1 由 不一致的 编码格式 iso-8859-1 转换成乱码后,可以再次还原为字节流,最后使用一致的编码格式得到正确的中文 

好,明白这一点,第一我们首先看 request ,从浏览器到服务器的请求过程,form表单的提交信息需要 经过编码(什么编码??想一想,我们如何知道) 转为字节流,而后(这里讲tomcat)服务器会 逆向把字节流 通过默认编码iso-8859-1来还原为字符流,此时我们使用request.getParameter("XX")得到的东东是正确?还是乱码? 关键问题是:form表单提交时转换字节流时的 编码格式(A)   和   tomcat 把字节流转回字符流的 编码格式(B) 一致吗? 
编码格式(B)=“iso-8859-1” 
编码格式(A)我们从下面图中找:图示为简体中文(GB2312) 
 

结果乱码。 
简单的解决方法: 
Java代码  收藏代码
  1. new String(request.getParameter("XX").getBytes("ISO-8859-1"),"GB2312")//每个参数都要这样做,代码重复  

或者 
Java代码  收藏代码
  1. request.setCharacterEncoding("GB2312");  
  2. request.getParameter("XX")//至少每个获取参数的地方需要写一次  


OK! 问题是解决了,好点的办法:使用过滤器(如何实现?百度就可以)所有的请求都过滤。一次性了事。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值