Love Pisces

It's not your aptitude but your attitude that determines your altitude!
posts - 2, comments - 43, trackbacks - 0, articles - 9

如何处理中文乱码问题

Posted on 2007-06-10 14:20 筱筱 阅读(3110) 评论(43)  编辑  收藏 所属分类: Java

      在Java编程中,经常会碰到汉字的处理及显示问题,以不小心就会产生一大堆乱码或者问号。造成这种问题的根本原因是Java中默认的编码方式是Unicode,而中国人通常使用的文件和DB都是基于GB2312或BIG5等编码,故会出现此问题。
      对于不同的问题,不同的JDK版本,不同的应用服务器(如Tomcat,Jboss,Weblogic),处理方法都会有一些微小的差异。在这里,主要针对Tomcat中JSP开发容易出现的中文乱码问题进行讨论,一般有以下几种情况:

      1.JSP中输出中文的乱码问题

      所谓在JSP输出中文,即直接在JSP中输出中文,或者给变量赋中文值再输出等,这种情况下的乱码问题往往是因为没有给JSP页面制定显示字符的编码方式,解决问题如下:

      ·在JSP页面头部加上语句<%@ page contentType="text/html;charset=gbk"%>(在Servlet页面中使用

httpServletResponse.setContentType("text/html;charset=gbk")),最好同时在JSP页面的head部分加上<meta http-equiv="Content-Type" content="text/html;charset=gbk">

      ·在每次要输出中文的地方主动转换编码方式,比如要在页面中输入“中文”二字,就可以用以下方式:

<%
      String str
="中文";
      
byte[] tmpbyte=str.getBtyes("ISO-8859-1");
      str
=new String(tmpbyte);
      out.print(str);
%>


      2.获取表单提交的数据时的中文乱码问题

      在没有加任何其他处理之前,用request.getParameter(panamName)获取表单提交中的数据,且表单数据中含有中文时,返回的字符串会出现乱码。出现这种问题的原因是Tomcat的J2EE实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理。
      比如,建立一个test.jsp,内容为:

<%@ page contentTyp="text/html;charset=gbk"%>
<%
      String str
=request.getParameter("chStr");
      
if(str==null) str="没有输入值";
%>
<html>
   
<head>
      
<title>中文Test</title>
      
<meta http-equiv="Content-Type" content="text/html;charset=gbk">
      
<meta http-equiv=param content=no-cache>
   
</head>
   
<body>你输入的内容为:<%=str%><br>
      
<form action="test.jsp" method="post">
      请输入中文:
<input type="text" name="chStr">
      
<input type="submit" value="确定">
      
</form>
   
</body>
</html>


      运行过后,在输入框中输入汉字“中文”,提交过后再显示出来后就变成了一堆乱码。解决此问题的办法有两个。一是不修改其他设置,只是在将表单中的中文数据取出来过后再转换编码,方法如语句String str=request.getParameter("chStr");String str=new String(sre.getByte("ISO-8859-1"),"gbk"),但这种方法只是从一个局部来考虑问题,如果这样的地方太多,就不得不将这条语句重复写很多次,在比较大的项目中,这是一种不太可行的方案。另一个方法就是让对所有页面的请求都通过一个Filter,将处理字符集设置为gbk。具体的做法如下(在Tomcat的webapps/servlet-examples目录有一个完整的例子,也可以参考其中web.xml和SetCharacter EncodingFilter的配置):

      首先将%TOMCAT%/webapps/servlets-examples/Web-INF/classes/filters/目录下的文件SetCharacterEncodingFilter.class拷贝到自己应用的/Web-INF/classes/com/util/filter目录下;然后再在web.xml文件的<web-app>后面加上如下配置代码:

<filter>
     
<filter-name>Set Character Encoding</filter-name>
     
<filter-class>com.ccut.struts.SetCharacterEncodingFilter</filter-class>
     
<init-param>
        
<param-name>encoding</param-name>
        
<param-value>gbk</param-value>
     
</init-param>
</filter>
<filter-mapping>
     
<filter-name>Set Character Encoding</filter-name>
     
<url-pattern>/*<url-pattern>
   </filter-mapping>


      3.URL中的中文问题

      对于直接通过在URL中传递中文参数,如“http://localhost/a.jsp?str=中文”这样的get请求,在服务端用request.getParameter("name")时返回的往往是乱码。按以上的做法设置Filter没有用,用request.setCharacterEncoding("gbk")的方式,仍然不管用。
            例如,建立test2.jsp文件,内容为:

<%@ page contentTyp="text/html;charset=gbk"%>
<%
      String str
=request.getParameter("chStr");
      
if(str==null) str="没有输入值";
%>
<html>
      
<head>
         
<title>中文Test</title>
         
<meta http-equiv="Content-Type" content="text/html;charset=gbk">
         
<meta http-equiv=param content=no-cache>
      
</head>
      
<body>你输入的内容为:<%=str%><br>
      
<form action="test.jsp" method="post">
         
<a href="test2.jsp?chStr=中文">点击这里提交中文参数</a>
      
</form>
      
</body>
</html>

      运行后,可见通过URL传递的中文参数取出来过后变成了乱码,造成这种结果的原因是Tomcat中以get方式提交的请求对query-string处理时采用了和post方法不一样的处理方式。
      解决这个问题的方法是打开Tomcat安装目录下的/conf/server.xml文件,找到Connector块,往其中添加URIEncoding="gbk",添加过后完整的Connector块代码如下:

<Connector port="8080"               
maxThreads
="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
   debug="0" connectionTimeout="20000" 
   disableUploadTimeout="true" 
   URIEncoding="gbk"
   />


      4.数据库访问时的乱码问题

      在建立数据库时,将数据库中的所有表的编码方式都设置为gbk,原因是JSP中也使用了gbk编码,这样统一的结果是可以减少很多不必要的编码转换问题。另外,在使用JDBC连接MySQL数据库时,连接字符串写成如下形式可以避免一些中文问题:

jdbc://mysql://hostname:port/DBname?user=username&
password=pwd&
useUnicode
=True&
characterEncoding
=gbk

      如果是以数据源的方式连接数据库,在配置文件中使用:
<parameter>
<name>url</name>
<value>
jdbc://mysql://hostname:port/DBname?
&useUnicode=True&characterEncoding=gbk
</value>
</parameter>

      但是,如果使用一个已经存在的数据库,数据库的编码方式是ISO-8859-1,而Web应用中使用UTF-8,且数据库中已经有很多重要信息,因此不能通过更改数据库的编码方式来解决问题。这个时候,在往数据库中写数据库时,一定要在JDBC连接字符串中加入“useUnicode=True&characterEncoding=ISO-8859-1”,这样可以顺利的往数据库中写入正常的数据。但是,在将数据读出数据库时,乱码又会出现,这个时候就应该在数据取出时对其转码,可以将转码功能写为一个函数,具体实现如下:
public String charConvert(String src){
      String result
=null;
   
if(src!=null){
   
try{
         result
=new String(src.getBytes("ISO=8859-1"),"gbk");
      }
catch(Exception e)
   
{
            result
=null;
            }

      }

      
return result; 
}
      于是,在从数据库读出数据过后调用charConvert(rs.getString("colName")),这样就可以正常显示数据库中的中文数据了。

Feedback

# re: 如何处理中文乱码问题[未登录]  回复  更多评论   

2007-09-20 13:12 by p
谢谢!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-12 16:06 by sunway
呵呵,你的亲老公来过!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 08:48 by sunway
在我想起你无法控制的时候,我就到这来发泄吧!希望在这里能够越写越少!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 08:50 by sunway
反正你也看不到,看我能不能自己把它顶成大长帖,看看到底能有多长。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 09:00 by sunway
是不是被诅咒了?永远都是到最后一步失败?

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 09:32 by sunway
我想回家

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 11:30 by sunway
如果上天能把你还给我该多好,我感觉就像在演电影,你被下了魔法,使整个人改变了。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 13:40 by sunway
小兔子,呵呵,跑起来真可爱!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 13:49 by sunway
在这里,心情就好一点,仿佛看到你一样

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 13:51 by sunway
老婆,真希望永远可以这么称呼,好久没有看到温柔的你了。怀念.......

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 14:19 by sunway
女人的心好奇怪,过了一次火焰山,又溜达到北极了!能跑回赤道也行啊!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 14:52 by sunway
好想和你说话,给你写信,我怕更糟糕,更让你烦,该怎么办呢。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 15:29 by sunway
我还是鼓起勇气写了,不知道你会不会仔细的看完,体会我的真心!我最担心的是你把这里也封了,那我一个靠岸的地方都没有了!

上帝啊!我也做了那面多好事,你也帮我一次!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 20:04 by sunway
每个人都要为自己做的错事付出代价,这话是真的,但是老天爷啊,你能给我这次机会吗?我已经知道错了,这次的惩罚对我来说太大了,我根本受不了啊,求您了,宽恕我这次吧!我愿意减寿10年,别让她离开我。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 20:07 by sunway
离回去还有12天,对我来说那就是12年,时间快点过吧!不要让我心爱的人选择放弃!千万不要啊!我会用我的全部来弥补我的过失,除了她。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-21 21:36 by sunway
你的每一句话,都在我心里回荡,酸,疼,后悔,害怕。12天,千万要经的住考验呢,我除了担心,一点力都用不上!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-22 09:07 by sunway
宝贝,票很难买啊,我很早就定着了,今天就可以定1号的票了,正规途径是买不到了,我在联系黄牛,无论如何我都要回去和你团聚!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-22 11:45 by sunway
宝贝,我吃饭去了,你也要照顾好自己,等回去了,我就会全身心的照顾你了,嘿嘿!还得找票,真难买啊!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-22 13:46 by sunway
大盘跌的好厉害,人都说情场失意,赌场得意,看来我真的是受到了惩罚,双失意。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-22 16:52 by sunway
不行了,脑袋不停的想,看着书,可脑袋里却想着怎么能让你回头,就没有更好的办法了吗?

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-22 21:54 by sunway
原来变了心是这么的无情,我用100%的心写了我所有的想法,还是无动于衷,难道再也找不回来了吗?他是谁呀,我真是对他佩服的五体投地。到底发生过什么呢?短短几次,我就变成了不值钱的尘土。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-23 09:06 by sunway
宝贝,早上好,票还没定到,真着急啊!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-23 09:23 by sunway
老婆,回头吧!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-23 11:26 by sunway
还没买到票呢,宝贝,一定要保佑我顺利回去,我一定要看到你!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-24 08:36 by sunway
老婆,早上好,昨天很晚睡觉,今天一定起来很困吧!晚上进去寝室了吗?你和楼下的说一下吧,有时候加班会很晚回去。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-24 13:46 by sunway
也不知道你会看到这里吗?亲爱的,时间快快过吧,早点回去看到你,再也不分开。

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-24 15:45 by sunway
又想你想的不行了,一直在想做什么能让你高兴,能让你回来呢,我现在想到了四件大事,我已经努力了两件了,不过有一件太有难度了,而且需要很长时间,还可能办不成,我苦苦的求我叔,终于被我感动愿意再帮我试试,另一件应该能办好吧,希望在我回去之前能办好,最后两件只有我亲自能办了,也不知道老婆能不能给我这个机会了。老婆,我爱你!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-24 20:01 by sunway
老婆,你每天都在干什么呢?我很想你,每天这个时候我都在给你写信,都在想你,你能感觉到我的思念吗?

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-25 08:44 by sunway
老婆,早上好,我在这里就好像能和你说话一样,记得想我啊!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-25 14:46 by sunway
好高兴啊,和你说话了,哈哈。吃蜂蜜都没这么甜!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-25 16:35 by sunway
亲爱的,我的宿舍到期了,不让我住,真闹心,我现在是赖着不走啊,等熬过下周我就回去了,呵呵,保佑我一定要赖过去啊!嘎嘎!亲亲!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-25 18:47 by sunway
老婆,我去吃饭了,你在学校一定要吃好饭呢,就怕你省钱,回去我都给老婆报,老婆一定要吃好啊!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-26 10:36 by sunway
老婆,早上好,你今天在加班,真辛苦,我都不敢打扰你,等你累了一定要给我打电话放松一下啊!555我在这写的你也看不到!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-26 12:11 by sunway
老婆,你又不理我,回一个信息也行啊555,臭老婆,不知道想你呢!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-27 17:27 by sunway
宝贝,很快就见到你了,希望经过这次,我们能合好如初,然后更加好!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-28 08:45 by sunway
老婆,早上好!心情很低落,不想影响到你,其实是你影响到我!

加油!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-28 13:31 by sunway
老婆,我又来看你了,每天你都很忙,我会用心支持你的。不要很累,有些东西你要想开啊!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-28 16:53 by sunway
记住这历史性的一刻,老婆近期第一次和我说话就是在10分钟前,说也很想我回去,但结果未卜啊,即使我最后失败了,我也会爱护你的,老婆,今天真的很感谢你!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-29 09:07 by sunway
宝贝,早上好!我来了,嘎嘎!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-01-30 08:44 by sunway
亲爱的,昨天开集团大会,就早上打了招呼,老婆赎罪,先给您请安了!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-02-17 23:40 by sunway
老婆,今天的日子我又来了,希望我能为我以前的过失赎罪,我是罪人,我痛恨我自己,我也不会原谅我自己!

# 感谢  回复  更多评论   

2008-06-02 15:51 by 感谢
十分的感谢!!!!!

# re: 如何处理中文乱码问题  回复  更多评论   

2008-10-14 21:05 by 11
垃圾老公

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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问