posts - 32, comments - 153, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

又谈乱码问题解决

Posted on 2007-01-23 21:12 Zou Ang 阅读(4348) 评论(6)  编辑  收藏 所属分类:

有人说,乱码问题一直跟中国的程序员特别有缘,真是再同意不过了,不管是Struts,JSF,JSP,还是MySQL,Tomcat,全都或多或少有乱码的问题。
一般的做法有用Filter:

< filter >
    
< filter-name > Set Character Encoding </ filter-name >
    
< filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class >
    
< init-param >
      
< param-name > encoding </ param-name >
      
< param-value > GBK </ param-value >
    
</ init-param >
    
< init-param >
      
< param-name > ignore </ param-name >
      
< param-value > true </ param-value >
    
</ init-param >
  
</ filter >
  
< filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< url-pattern > *.do </ url-pattern >
  
</ filter-mapping >
  
< filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< url-pattern > *.jsp </ url-pattern >
  
</ filter-mapping >
  
< filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< url-pattern > *.html </ url-pattern >
  
</ filter-mapping >
  
< filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< url-pattern > *.htm </ url-pattern >
  
</ filter-mapping >


的,有用

<% request.setCharacterEncoding( " GBK " ); %>

的,还有用

<% @ page contentType = " text/html; charset=GBK "  pageEncoding = " GBK " %>


的,还可以用

<%  String name  =   new  String(request.getParameter( " name " ).getBytes( " 8859_1 " ),  " GB2312 " );  %>


昨天就在做项目的过程中,发现用URL传request参数的时候,在第二个页面上得到乱码的问题。把上面几种方法都试了一下还是不行。仔细追踪了一下,发现在页面的源代码上中文是正常的,一直到URL还是中文正常,可是在后台的Action里面log出来就成了乱码了,于是猜想是在request封装的过程中把中文变成乱码了,以致于后台直接就是取到的乱码。在后台Action中Set入中文,页面上正常显示,说明Struts的中文已经不存在问题。剩下的,应该就只有doGet和doPost方法的问题了。找了一下tomcat的配置文件,发现只要在server.xml中:

     <!--  Define a non-SSL HTTP/1.1 Connector on port 8080  -->
    
< Connector  port ="8080"  maxHttpHeaderSize ="8192"
               maxThreads
="150"  minSpareThreads ="25"  maxSpareThreads ="75"
               enableLookups
="false"  redirectPort ="8443"  acceptCount ="100"
               connectionTimeout
="20000"  disableUploadTimeout ="true" />
    
<!--  Note : To disable connection timeouts, set connectionTimeout value
     to 0 
-->

改为

     <!--  Define a non-SSL HTTP/1.1 Connector on port 8080  -->
    
< Connector  port ="8080"  maxHttpHeaderSize ="8192"
               maxThreads
="150"  minSpareThreads ="25"  maxSpareThreads ="75"
               enableLookups
="false"  redirectPort ="8443"  acceptCount ="100"
               connectionTimeout
="20000"  disableUploadTimeout ="true"  URIEncoding ="GBK" />
    
<!--  Note : To disable connection timeouts, set connectionTimeout value
     to 0 
-->

就是加上URIEncoding="GBK"就万事大吉了。
至此,应该再困难的乱码问题都解决了吧。就是要在页面上、数据库中、request里、doGet、doPost方法里面都是中文!看你还有什么地方躲??


评论

# re: 又谈乱码问题解决  回复  更多评论   

2007-01-23 23:18 by 小车马
不错,这个乱码问题,可能和tomcat容器有关,呵呵

楼主,潜力贴论坛(http://content.uu1001.com)是我个人的一个设想,如果你对java非常的专注,并且愿意交我这个朋友,可以发邮件给我(lbw070105@gmail.com),希望我们可以一起发展它。

# re: 又谈乱码问题解决  回复  更多评论   

2007-01-24 10:06 by swiftybin
好文章!!收藏了。多谢有心的楼主!

# re: 又谈乱码问题解决  回复  更多评论   

2007-01-24 10:09 by 小石头
好!!

# re: 又谈乱码问题解决  回复  更多评论   

2007-01-24 13:53 by BeanSoft
Tomcat 5 默认情况下, 用 request.setCharacterEncoding( " GBK " ); 这样的方法可以获得 POST 方法提交的中文, 而 GET 方法无论如何都需要强制转换编码
String name = new String(request.getParameter( " name " ).getBytes( " 8859_1 " ), " GB2312 " );
一般来说做个过滤器来对GET和POST做不同的判断处理即可.
至于楼主修改 Tomcat 配置的方式, 自己开发的应用还可以, 要是虚拟主机的话, 就不管用了.

# re: 又谈乱码问题解决  回复  更多评论   

2007-01-25 15:50 by 冷面阎罗
那weblogic的情况应该和tomcat差不多吧?还是
看了weblogic的config.xml好像没有地方改

# re: 又谈乱码问题解决[未登录]  回复  更多评论   

2007-01-25 16:00 by BeanSoft
Weblogic 的有自己的参数, 所以不是很推荐用这种改服务器参数的办法解决中文问题... 不同的服务器参数都不一样, 就是 Weblogic 自己的版本不一样, 参数也不一样...

参考: http://dev2dev.bea.com.cn/techdoc/200311546.html

只有注册用户登录后才能发表评论。


网站导航: