在Java編程中,經(jīng)常會(huì)碰到漢字的處理及顯示問題,以不小心就會(huì)產(chǎn)生一大堆亂碼或者問號(hào)。造成這種問題的根本原因是Java中默認(rèn)的編碼方式是Unicode,而中國(guó)人通常使用的文件和DB都是基于GB2312或BIG5等編碼,故會(huì)出現(xiàn)此問題。
對(duì)于不同的問題,不同的JDK版本,不同的應(yīng)用服務(wù)器(如Tomcat,Jboss,Weblogic),處理方法都會(huì)有一些微小的差異。在這里,主要針對(duì)Tomcat中JSP開發(fā)容易出現(xiàn)的中文亂碼問題進(jìn)行討論,一般有以下幾種情況: 1.JSP中輸出中文的亂碼問題 所謂在JSP輸出中文,即直接在JSP中輸出中文,或者給變量賦中文值再輸出等,這種情況下的亂碼問題往往是因?yàn)闆]有給JSP頁(yè)面制定顯示字符的編碼方式,解決問題如下: ·在JSP頁(yè)面頭部加上語句<%@ page contentType="text/html;charset=gbk"%>(在Servlet頁(yè)面中使用 httpServletResponse.setContentType("text/html;charset=gbk")),最好同時(shí)在JSP頁(yè)面的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>你輸入的內(nèi)容為:<%=str%><br> <form action="test.jsp" method="post"> 請(qǐng)輸入中文:<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"%> 運(yùn)行后,可見通過URL傳遞的中文參數(shù)取出來過后變成了亂碼,造成這種結(jié)果的原因是Tomcat中以get方式提交的請(qǐng)求對(duì)query-string處理時(shí)采用了和post方法不一樣的處理方式。 <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk" />
在建立數(shù)據(jù)庫(kù)時(shí),將數(shù)據(jù)庫(kù)中的所有表的編碼方式都設(shè)置為gbk,原因是JSP中也使用了gbk編碼,這樣統(tǒng)一的結(jié)果是可以減少很多不必要的編碼轉(zhuǎn)換問題。另外,在使用JDBC連接MySQL數(shù)據(jù)庫(kù)時(shí),連接字符串寫成如下形式可以避免一些中文問題: jdbc://mysql://hostname:port/DBname?user=username& password=pwd& useUnicode=True& characterEncoding=gbk 如果是以數(shù)據(jù)源的方式連接數(shù)據(jù)庫(kù),在配置文件中使用: <parameter> <name>url</name> <value> jdbc://mysql://hostname:port/DBname?&useUnicode=True&characterEncoding=gbk </value> </parameter> 但是,如果使用一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的編碼方式是ISO-8859-1,而Web應(yīng)用中使用UTF-8,且數(shù)據(jù)庫(kù)中已經(jīng)有很多重要信息,因此不能通過更改數(shù)據(jù)庫(kù)的編碼方式來解決問題。這個(gè)時(shí)候,在往數(shù)據(jù)庫(kù)中寫數(shù)據(jù)庫(kù)時(shí),一定要在JDBC連接字符串中加入“useUnicode=True&characterEncoding=ISO-8859-1”,這樣可以順利的往數(shù)據(jù)庫(kù)中寫入正常的數(shù)據(jù)。但是,在將數(shù)據(jù)讀出數(shù)據(jù)庫(kù)時(shí),亂碼又會(huì)出現(xiàn),這個(gè)時(shí)候就應(yīng)該在數(shù)據(jù)取出時(shí)對(duì)其轉(zhuǎn)碼,可以將轉(zhuǎn)碼功能寫為一個(gè)函數(shù),具體實(shí)現(xiàn)如下: 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; } 于是,在從數(shù)據(jù)庫(kù)讀出數(shù)據(jù)過后調(diào)用charConvert(rs.getString("colName")),這樣就可以正常顯示數(shù)據(jù)庫(kù)中的中文數(shù)據(jù)了。 |
|