关闭

JAVA学习26_中文乱码解决方案

标签: javajsp乱码
246人阅读 评论(0) 收藏 举报
分类:

前言:乱码问题,一直使我们头疼的问题。今天自己有空好好研究一番。不求太深入,只求只知皮毛。考虑不够全面,只求给您一点帮助足矣。

一、简单介绍下pageEncoding与contentType的区别(摘自网上)

     pageEncoding:设置JSP源文件和响应正文中的字符集编码。
     contentType:设置JSP源文件和响应正文的字符集编码及MIME类型。

      如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,  
      否则就由contentType属性中的charset决定,如果charset也不存在,JSP页面的字符编码方式就采用 默认的ISO-8859-1。

二、环境测试演练

   post请求

1、条件:html或者jsp中的charset :text/html;charset=gb2312 (即浏览器页面编码方式)
      没有filter,
      server.xml没有设置
      比如request.getParamter ,"汪" 转换成 Íô    new String("汪".getBytes("gb2312"),"iso-8859-1")
      结论:这是因为gb2312编码的“汪”,经iso-8859-1编码为Íô.
       因此需要转换  new String("Íô".getBytes("iso-8859-1"),"gb2312");
   
2、条件:在1的基础上,server.xml增加   
      uRIEncoding="gbk" useBodyEncodingForURI="true" 不起作用。
      并多次修改其值,对1中结果没有影响。
      结论:故推断,此设置不对post请求起作用。
3、条件:在1的基础上,增加fiter, request.setCharacterEncoding("gb2312");
       那么request.getParameter("name"),直接获得正常的值。
       结论: request.setCharacterEncoding 需要在request.getParameter("name")之前设置。具体可参考英文文档。

4、条件:在3的基础上,修改request.setCharacterEncoding("utf-8");
   那么,汉字"汪"就不会正常解析出来,因为  "汪"先经过gb2312--->iso-8859-1---->utf-8 编码
   若反过来,是不可逆的。锟斤拷  new String(new String(name.getBytes("utf-8"),"iso-8859-1").getBytes("iso-8859-1"),"gb2312");
   结论:因此不要设置两个或者两个以上不同的编码,导致编码复杂,可能造成不可逆。
   

get请求:
 1、条件:jsp 中 pageEncoding="UTF-8" charset=UTF-8",filter中 request.setCharacterEncoding("utf-8");  
      <a href="<%=request.getContextPath() %>/login.do?method=validate&username=汪&password=121322"">测试</a>
 
    分析:汪----utf-8----iso-8859-1----request.setCharacterEncoding("utf-8") 不起作用--   
      因此 String name=new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");才能显示正常的中文。
      
2、浏览器地址栏手动敲链接
     那么汪---GBK---ISO-8859-1
     因此String   name=new String(request.getParameter("username").getBytes("iso-8859-1"),"GBK");为正常中文。
3、在1的基础上,
    3.1)去除过滤器filter  
      3.1.1)只有 uRIEncoding="UTF-8"
             "汪"------utf-8----iso-8859-1---通过tomcat server.xml ---utf-8
             因此request.getParameter("username")为正常中文。
      3.1.2) 只有useBodyEncodingForURI="true"
               同3.1.3
      3.1.3)server.xml 增加uRIEncoding="UTF-8" useBodyEncodingForURI="true"  
             汪----utf-8----iso-8859-1
             因此 String  name=new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8"); 为正常中文
    3.2)增加过滤器filter  request.setCharacterEncoding("utf-8")
    
      3.2.1)只有 uRIEncoding="UTF-8"
             "汪"------utf-8----iso-8859-1---通过tomcat server.xml ---utf-8,注意filter不起作用
             因此request.getParameter("username")为正常中文。
      3.2.2) 只有useBodyEncodingForURI="true"
              "汪"------utf-8----iso-8859-1---过滤器 ---utf-8
              因此request.getParameter("username")为正常中文。 即同3.1.1
      3.2.3)server.xml 增加uRIEncoding="UTF-8" useBodyEncodingForURI="true"  
              同上
    
4、在2的基础上 
    4.1)去除过滤器fiter
        4.1.1)只有 uRIEncoding="UTF-8"
          汪------GBK-----ISO-8859-1---通过tomcat server.xml ---utf-8 
          request.getParameter("username"); 乱码。 若逆向编码的不可逆,
          new String(new String(request.getParameter("username").getBytes("utf-8"),"iso-8859-1").getBytes("iso-8859-1"),"gbk")----锟斤拷
        4.1.2)只有useBodyEncodingForURI="true"
              同4.1.3
        4.1.3)server.xml 增加uRIEncoding="UTF-8" useBodyEncodingForURI="true"
               汪------GBK-----ISO-8859-1
               因此 name=new String(request.getParameter("username").getBytes("iso-8859-1"),"GBK");
        
   4.2)增加过滤器request.setCharacterEncoding("utf-8");
        4.2.1)只有 uRIEncoding="UTF-8"
          汪------GBK-----ISO-8859-1---通过tomcat server.xml ---utf-8 
          request.getParameter("username"); 乱码。 若逆向编码的不可逆,
          new String(new String(request.getParameter("username").getBytes("utf-8"),"iso-8859-1").getBytes("iso-8859-1"),"gbk")----锟斤拷
        4.2.2)只有useBodyEncodingForURI="true"
              同4.1.1
        4.2.3)server.xml 增加uRIEncoding="UTF-8" useBodyEncodingForURI="true"
               同上
5、server.xml 增加uRIEncoding="UTF-8" useBodyEncodingForURI="true",无论设不设置过滤器,多次修改uRIEncoding="UTF-8"的编码。
      对结果无影响,useBodyEncodingForURI 优先级别比增加uRIEncoding 高。
 
总结:
1)request.setCharacterEncoding;只对post请求、get请求(server.xml中配置useBodyEncodingForURI="true")起作用。
2)server.xml 增加uRIEncoding="UTF-8" useBodyEncodingForURI="true" 只对get请求起作用。
3)地址栏手动链接。根据系统编码gbk----iso-8859-1
4)request.setCharacterEncoding 应该设置在request.getParameter之前。
5)对server.xml只有uRIEncoding="UTF-8"配置的情况下。 会对get请求uri进行utf-8编码
6)若useBodyEncodingForURI="true" 优先级比uRIEncoding="UTF-8"高。即设置前者后,后者不起作用。

因此建议最好 jsp 中pageEncoding,contentType,server.xml  uRIEncoding="UTF-8" useBodyEncodingForURI="true"  fileter为request.setChara

cterEncoding,保持一致。


原文来自:http://blog.csdn.net/wlbing0625/article/details/8101771

0
0
查看评论

java中文乱码解决方案和经验

1.字节和unicode java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此java要对这些字节流经行转化。char是unicode的,而byte是字节。java中byte/char互转的函数在sun.io的包中间有。其中ByteToCh...
  • rcyl2003
  • rcyl2003
  • 2007-04-16 22:12
  • 621

struts项目中文乱码解决方案(java中文乱码解决方案)

 关于struts项目,本人有以下解决方案:  jsp  需修改:@ page contentType="text/html;charset=UTF-8" %>meta http-equiv=&...
  • hiyu2218
  • hiyu2218
  • 2007-12-12 11:52
  • 1513

Ultraedit打开中文乱码解决方案

若是直接用UE打开会出现中文乱码问题,修改UE编码也无法显示正常,在网上查了很多资料也不无效。以下方案亲测有效!解决方案: 借助notepad++ 1. 先用Ntepad++打开,编码–以UTF-8格式编码 2. 再使用Notpad++打开,中文正常显示!
  • s394500839
  • s394500839
  • 2017-08-10 14:24
  • 179

java中文乱码完全解决方案

1、代码编码全部用UTF8,特别是配置用的属性文件 2、JSP页面编码 3、request请求编码 4、数据库jdbc连接编码jdbc:mysql://127.0.0.1:3306/nts?useUnicode=true&characterEncoding=utf8 5、数据库编码 ...
  • tianlang519241
  • tianlang519241
  • 2017-04-07 10:42
  • 191

java中文乱码解决方案

====================================================== 注:本文源代码点此下载 ====================================================== java中文乱码解决方案 struts2中文...
  • javazhuanzai
  • javazhuanzai
  • 2012-01-15 02:33
  • 159

java中文乱码-经典解决方案

 编写java web的程序,不可避免都要处理编码问题,最常见的问题就是中文乱码 大概的思路就是重新编码为gbk或者gb2312,分两种情况 一是get和post形式 二是AJax 形式 第一种:GET和POST,取决于你的页面编码,如果你的页面编码为iso8859_1 使用:Str...
  • sivyer123
  • sivyer123
  • 2014-01-10 10:01
  • 1959

Java操作:中文乱码解决方案

阅读该文之前,需要对字节、字符与编码有所了解,否则将不容易理解。可参照《字节、字符与编码》 乱码产生的原因以及解决方案 所有数据都是以流的方式进行传输与存储的,比如读取一个文件的数据,将文件数据写入到输入流中,程序从输入流中读取数据,保存数据时,程序将数据写入到输出流中,...
  • psiitoy
  • psiitoy
  • 2014-05-22 16:29
  • 543

Java 中文乱码解决方案汇总

Java 中文乱码解决方案汇总(2009-07-24 08:16:10)标签:it   花掉了整整一个下午, 读了 sun, ibm, csdn, javaeye 几个网站相关资料共 12 篇, 把 Java 开发中目前可能遇到的中文乱码问题及解决方案总结了一下, 记下...
  • okman1214
  • okman1214
  • 2009-08-03 16:35
  • 742

java中文乱码终极解决方案

转载自这篇文章简单描述:1、get方式乱码:tomcat 的server.xml 中加 URIEncoding=&quot;UTF-8&quot;2、post方式乱码:使用过滤器即可解决3、log4j在linux下显示乱码解决方法:log4j配置文件中加一句话即可解决:log4j.a...
  • czh500
  • czh500
  • 2018-02-12 08:30
  • 52

java连接mysql数据库乱码的解决方法

转:http://www.jb51.net/article/37054.htm 这篇文章主要介绍通过java连接mysql数据库的时候,页面出现乱码,这里简单分享下解决方法, 需要的朋友可以参考下 解决方法一:  mysql安装时候的编码,...
  • pzasdq
  • pzasdq
  • 2016-08-10 19:50
  • 626
    个人资料
    • 访问:693685次
    • 积分:9015
    • 等级:
    • 排名:第2488名
    • 原创:115篇
    • 转载:431篇
    • 译文:37篇
    • 评论:39条
    文章分类