在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); %>
<%@ 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>
<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>
<%@ page contentTyp="text/html;charset=gbk"%> 运行后,可见通过URL传递的中文参数取出来过后变成了乱码,造成这种结果的原因是Tomcat中以get方式提交的请求对query-string处理时采用了和post方法不一样的处理方式。 <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk" />
在建立数据库时,将数据库中的所有表的编码方式都设置为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")),这样就可以正常显示数据库中的中文数据了。 |
|