日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何處理JAVA中文亂碼問題

 七天七世紀(jì)丫 2012-04-25
在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">

·在每次要輸出中文的地方主動(dòng)轉(zhuǎn)換編碼方式,比如要在頁(yè)面中輸入“中文”二字,就可以用以下方式:




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


2.獲取表單提交的數(shù)據(jù)時(shí)的中文亂碼問題

在沒有加任何其他處理之前,用request.getParameter(panamName)獲取表單提交中的數(shù)據(jù),且表單數(shù)據(jù)中含有中文時(shí),返回的字符串會(huì)出現(xiàn)亂碼。出現(xiàn)這種問題的原因是Tomcat的J2EE實(shí)現(xiàn)對(duì)表單提交,即以POST方式提交的參數(shù)采用默認(rèn)的ISO-8859-1來處理。
比如,建立一個(gè)test.jsp,內(nèi)容為:




<%@ 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>


運(yùn)行過后,在輸入框中輸入漢字“中文”,提交過后再顯示出來后就變成了一堆亂碼。解決此問題的辦法有兩個(gè)。一是不修改其他設(shè)置,只是在將表單中的中文數(shù)據(jù)取出來過后再轉(zhuǎn)換編碼,方法如語句String str=request.getParameter("chStr");String str=new String(sre.getByte("ISO-8859-1"),"gbk"),但這種方法只是從一個(gè)局部來考慮問題,如果這樣的地方太多,就不得不將這條語句重復(fù)寫很多次,在比較大的項(xiàng)目中,這是一種不太可行的方案。另一個(gè)方法就是讓對(duì)所有頁(yè)面的請(qǐng)求都通過一個(gè)Filter,將處理字符集設(shè)置為gbk。具體的做法如下(在Tomcat的webapps/servlet-examples目錄有一個(gè)完整的例子,也可以參考其中web.xml和SetCharacter EncodingFilter的配置):

首先將%TOMCAT%/webapps/servlets-examples/Web-INF/classes/filters/目錄下的文件SetCharacterEncodingFilter.class拷貝到自己應(yīng)用的/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中的中文問題

對(duì)于直接通過在URL中傳遞中文參數(shù),如“http://localhost/a.jsp?str=中文”這樣的get請(qǐng)求,在服務(wù)端用request.getParameter("name")時(shí)返回的往往是亂碼。按以上的做法設(shè)置Filter沒有用,用request.setCharacterEncoding("gbk")的方式,仍然不管用。
例如,建立test2.jsp文件,內(nèi)容為:



<%@ 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">
<a href="test2.jsp?chStr=中文">點(diǎn)擊這里提交中文參數(shù)</a>
</form>
</body>
</html>

運(yùn)行后,可見通過URL傳遞的中文參數(shù)取出來過后變成了亂碼,造成這種結(jié)果的原因是Tomcat中以get方式提交的請(qǐng)求對(duì)query-string處理時(shí)采用了和post方法不一樣的處理方式。
解決這個(gè)問題的方法是打開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.數(shù)據(jù)庫(kù)訪問時(shí)的亂碼問題

在建立數(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ù)了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多