中文乱码问题的根本解决办法是明确地指定整个应用系统统一的字符集

本文详细介绍了在Java Web开发中解决中文乱码问题的方法,包括设置统一字符集、使用过滤器、设定数据库连接方式等,并针对GET方法及URL传参时的特殊处理给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

楼主angues1980(石头心)(JSF学习中)2005-08-16 11:45:48 在 Java / Web 开发 提问

昨天转贴了一篇《Java/J2EE中文问题终极解决之道》的文章(原贴http://www.jdon.com/idea/chinesejava.htm),里面提到“中文乱码问题的根本解决办法是明确地指定整个应用系统统一的字符集”。  
  要做到以下几点:  
  一、开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。    
  二、使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:  
  request.setCharacterEncoding("UTF-8")。  
  网上有此filter的源码,Jdon框架源码中com.jdon.util.SetCharacterEncodingFilter  
  需要配置web.xml   激活该Filter。    
  三、在JSP头部声明:<%@   page   contentType="text/html;charset=   UTF-8"   %>。    
  四、在Jsp的html代码中,声明UTF-8:<meta   http-equiv="Content-Type"   content="text/html;charset=utf-8">    
  五、设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:  
  jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8  
  一般数据库都可以通过管理设置设定UTF-8    

 

    mysql可以修改my.ini配置文件,将以下设置改为utf8

[mysql]
default-character-set=utf8

 
  六、其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。    
   
  但是经过笔者测试还有几个问题文中的方法不能完全解决:  
  1.Form里面用GET方法传参时转换的问题;  
  2.URL后附带中文传参时的转换问题。  
   
  环境:操作系统WindowsXP   SP2(中文),Eclipse   3.1   with   Lomboz,tomcat   5.5.9   ,IE   6.0  
   
  一、正常POST方法传参:  
  页面a.jsp  
  <%@   page   language="java"   contentType="text/html;charset=UTF-8"   pageEncoding="UTF-8"%>  
  <html>  
  <head>  
  <meta   http-equiv="Content-Type"   content="text/html;charset=UTF-8"%>  
  </head>  
  <FORM   METHOD=POST   ACTION="/webtest/b.jsp"><INPUT   TYPE="text"   NAME="parm">  
  <INPUT   TYPE="submit"></FORM>  
  </html>  
  页面b.jsp  
  <%@   page   language="java"   contentType="text/html;   charset=UTF-8"   pageEncoding="UTF-8"%>  
  <html>  
  <head>  
  <meta   http-equiv="Content-Type"   content="text/html;charset=UTF-8"%>  
  </head>  
  <%  
  request.setCharacterEncoding("UTF-8");  
  String   strParm   =   request.getParameter("parm");  
  out.println(strParm);  
  %>  
  </html>  
  没有任何问题。  
   
  二、Form里面用GET方法传参时转换问题的解决方法:  
  页面a.jsp  
  ……  
  <FORM   METHOD=GET   ACTION="/webtest/b.jsp"><INPUT   TYPE="text"   NAME="parm">  
  ……  
  页面b.jsp  
  ……  
  String   strDisplay   =   new   String(strParm.getBytes("ISO8859-1"),   "UTF-8");  
  out.println(strDisplay);  
  ……  
   
  分析:根据解决方法判断,可能是在FORM在用GET方法包装参数到地址栏的URL链接时或者是在URL传递前,用的是ISO8859-1的编码(并且所用IE浏览器的高级选项中设置了总是以UTF-8发送URL这项,可以排除是在URL发送后转换的ISO8859-1编码),而这个编码方式的修改好像并不在《Java/J2EE中文问题终极解决之道》文中提到的那几个步骤之中,  
   
  三、URL后附带中文传参时的转换问题的解决方法:  
  修改b.jsp页面  
  ……  
  String   strDisplay   =   new   String(strParm.getBytes("ISO8859-1"),   "GBK");  
  ……  
   
  分析:根据解决方法判断,URL在传递前,用本地操作系统的默认编码(GBK)把中文编码为ISO8859-1。  
   
  同理,使用Servlet测试(包括建立Filter对请求进行编码转化),结果相同,不再赘述。  
   
  怎样才能用一种方法,一劳永逸地解决这3种情况下中文乱码问题呢?  
  1、用获取字符串的编码格式的方法(目前还没找到)来判断后调用各个方法。  
  2、还有一个是应用中不用GET方法和URL方法来传递参数。  
  3、必须使用GET方法或者URL方法传中文时,首先进行编码转化,比如建立静态文本常量的XXXX.properties文件,事先用JDK自带的vatie2ascii工具进行转化。  
  4、还有就是建立个空白页面包装参数再用POST方法转发。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值