如何处理中文乱码问题

在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 " c ontent = " 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>
    </fil ter-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")),这样就可以正常显示数据库中的中文数据了。
 
 
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页