解決jsp中文顯示問(wèn)題_第1頁(yè)
解決jsp中文顯示問(wèn)題_第2頁(yè)
解決jsp中文顯示問(wèn)題_第3頁(yè)
解決jsp中文顯示問(wèn)題_第4頁(yè)
解決jsp中文顯示問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

解決:jsp頁(yè)面中文顯示問(wèn)題<%@pagepageEncoding二”gb2312〃 %>,決定jsp頁(yè)面編寫(xiě)時(shí)的編碼。<%@pagecontent_type="text/html;charset二UTF-8" %>,決定jsp頁(yè)面顯示在客戶(hù)端瀏覽器的編碼。在解決這個(gè)問(wèn)題的同時(shí),我還發(fā)現(xiàn)了一篇至今為止我所見(jiàn)過(guò)的解決java中文問(wèn)題最徹底的文章:上篇:/pcedu/empolder/gj/java/0404/366404.html下篇:/pcedu/empolder/gj/java/0405/36876O.html深入Java中文問(wèn)題及最優(yōu)解決方法Abstract:本文深入分析了Java程序設(shè)計(jì)中Java編譯器對(duì)java源文件和JVM對(duì)class類(lèi)文件的編碼/解碼過(guò)程,通過(guò)此過(guò)程的解析透視出了Java編程中中文問(wèn)題產(chǎn)生的根本原因,最后給出了建議的最優(yōu)化的解決Java中文問(wèn)題的方法。1、中文問(wèn)題的來(lái)源計(jì)算機(jī)最初的操作系統(tǒng)支持的編碼是單字節(jié)的字符編碼,于是,在計(jì)算機(jī)中一切處理程序最初都是以單字節(jié)編碼的英文為準(zhǔn)進(jìn)行處理。隨著計(jì)算機(jī)的發(fā)展,為了適應(yīng)世界其它民族的語(yǔ)言(當(dāng)然包括我們的漢字),人們提出了UNICODE編碼,它采用雙字節(jié)編碼,兼容英文字符和其它民族的雙字節(jié)字符編碼,所以,目前,大多數(shù)國(guó)際性的軟件內(nèi)部均采用UNICODE編碼,在軟件運(yùn)行時(shí),它獲得本地支持系統(tǒng)(多數(shù)時(shí)間是操作系統(tǒng))默認(rèn)支持的編碼格式,然后再將軟件內(nèi)部的UNICODE轉(zhuǎn)化為本地系統(tǒng)默認(rèn)支持的格式顯示出來(lái)。Java的JDK和JVM即是如此,我這里說(shuō)的JDK是指國(guó)際版的JDK,我們大多數(shù)程序員使用的是國(guó)際化的JDK版本,以下所有的JDK均指國(guó)際化的JDK版本。我們的漢字是雙字節(jié)編碼語(yǔ)言,為了能讓計(jì)算機(jī)處理中文,我們自己制定的gb2312、GBK、GBK2K等標(biāo)準(zhǔn)以適應(yīng)計(jì)算機(jī)處理的需求。所以,大部分的操作系統(tǒng)為了適應(yīng)我們處理中文的需求,均定制有中文操作系統(tǒng),它們采用的是GBKGB2312編碼格式以正確顯示我們的漢字。如:中文Win2K默認(rèn)采用的是GBK編碼顯示,在中文WIN2k中保存文件時(shí)默認(rèn)采用的保存文件的編碼格式也是GBK的,即,所有在中文WIN2K中保存的文件它的內(nèi)部編碼默認(rèn)均采用GBK編碼,注意:GBK是在GB2312基礎(chǔ)上擴(kuò)充來(lái)的。由于Java語(yǔ)言?xún)?nèi)部采用UNICODE編碼,所以在JAVA程序運(yùn)行時(shí),就存在著一個(gè)從UNICODE編碼和對(duì)應(yīng)的操作系統(tǒng)及瀏覽器支持的編碼格式轉(zhuǎn)換輸入、輸出的問(wèn)題,這個(gè)轉(zhuǎn)換過(guò)程有著一系列的步驟,如果其中任何一步出錯(cuò),則顯示出來(lái)的漢字就會(huì)出是亂碼,這就是我們常見(jiàn)的JAVA中文問(wèn)題。同時(shí),Java是一個(gè)跨平臺(tái)的編程語(yǔ)言,也即我們編寫(xiě)的程序不僅能在中文windows上運(yùn)行,也能在中文Linux等系統(tǒng)上運(yùn)行,同時(shí)也要求能在英文等系統(tǒng)上運(yùn)行(我們經(jīng)??吹接腥税言谥形膚in2k上編寫(xiě)的JAVA程序,移植到英文Linux上運(yùn)行)。這種移植操作也會(huì)帶來(lái)中文問(wèn)題。還有,有人使用英文的操作系統(tǒng)和英文的IE等瀏覽器,來(lái)運(yùn)行帶中文字符的程序和瀏覽中文網(wǎng)頁(yè),它們本身就不支持中文,也會(huì)帶來(lái)中文問(wèn)題。幾乎所有的瀏覽器默認(rèn)在傳遞參數(shù)時(shí)都是以UTF-8編碼格式來(lái)傳遞,而不是按中文編碼傳遞,所以,傳遞中文參數(shù)時(shí)也會(huì)有問(wèn)題,從而帶來(lái)亂碼現(xiàn)象??傊?,以上幾個(gè)方面是JAVA中的中文問(wèn)題的主要來(lái)源,我們把以上原因造成的程序不能正確運(yùn)行而產(chǎn)生的問(wèn)題稱(chēng)作:JAVA中文問(wèn)題。2、JAVA編碼轉(zhuǎn)換的詳細(xì)過(guò)程我們常見(jiàn)的JAVA程序包括以下類(lèi)別:*直接在console上運(yùn)行的類(lèi)(包括可視化界面的類(lèi))*JSP代碼類(lèi)(注:JSP是Servlets類(lèi)的變型)*Servelets類(lèi)*EJB類(lèi)*其它不可以直接運(yùn)行的支持類(lèi)這些類(lèi)文件中,都有可能含有中文字符串,并且我們常用前三類(lèi)JAVA程序和用戶(hù)直接交互,用于輸出和輸入字符,如:我們?cè)贘SP和Servlet中得到客戶(hù)端送來(lái)的字符,這些字符也包括中文字符。無(wú)論這些JAVA類(lèi)的作用如何,這些JAVA程序的生命周期都是這樣的:*編程人員在一定的操作系統(tǒng)上選擇一個(gè)合適的編輯軟件來(lái)實(shí)現(xiàn)源程序代碼并以.java擴(kuò)展名保存在操作系統(tǒng)中,例如我們?cè)谥形膚in2k中用記事本編輯一個(gè)java源程序;*編程人員用JDK中的javac.exe來(lái)編譯這些源代碼,形成.class類(lèi)(JSP文件是由容器調(diào)用JDK來(lái)編譯的);*直接運(yùn)行這些類(lèi)或?qū)⑦@些類(lèi)布署到WEB容器中去運(yùn)行,并輸出結(jié)果。那么,在這些過(guò)程中,JDK和JVM是如何將這些文件如何編碼和解碼并運(yùn)行的呢?這里,我們以中文win2k操作系統(tǒng)為例說(shuō)明JAVA類(lèi)是如何來(lái)編碼和被解碼的。第一步,我們?cè)谥形膚in2k中用編輯軟件如記事本編寫(xiě)一個(gè)Java源程序文件(包括以上五類(lèi)JAVA程序),程序文件在保存時(shí)默認(rèn)采用了操作系統(tǒng)默認(rèn)支持GBK編碼格式(操作系統(tǒng)默認(rèn)支持的格式為file.encoding格式)形成了一個(gè).java文件,也即,java程序在被編譯前,我們的JAVA源程序文件是采用操作系統(tǒng)默認(rèn)支持的file.encoding編碼格式保存的,java源程序中含有中文信息字符和英文程序代碼;要查看系統(tǒng)的file.encoding參數(shù),可以用以下代碼:publicclassShowSystemDefaultEncoding{publicstaticvoidmain(String[]args){Stringencoding=System.getProperty("file.encoding");System.out.println(encoding);}}第二步,我們用JDK的javac.exe文件編譯我們的Java源程序,由于JDK是國(guó)際版的,在編譯的時(shí)候,如果我們沒(méi)有用-encoding參數(shù)指定我們的JAVA源程序的編碼格式,則javac.exe首先獲得我們操作系統(tǒng)默認(rèn)采用的編碼格式,也即在編譯java程序時(shí),若我們不指定源程序文件的編碼格式,JDK首先獲得操作系統(tǒng)的file.encoding參數(shù)(它保存的就是操作系統(tǒng)默認(rèn)的編碼格式,如WIN2k,它的值為GBK),然后JDK就把我們的java源程序從file.encoding編碼格式轉(zhuǎn)化為JAVA內(nèi)部默認(rèn)的UNICODE格式放入內(nèi)存中。然后,javac把轉(zhuǎn)換后的unicode格式的文件進(jìn)行編譯成.class類(lèi)文件,此時(shí).class文件是UNICODE編碼的,它暫放在內(nèi)存中,緊接著,JDK將此以UNICODE編碼的編譯后的class文件保存到我們的操作系統(tǒng)中形成我們見(jiàn)到的.class文件。對(duì)我們來(lái)說(shuō),我們最終獲得的.class文件是內(nèi)容以UNICODE編碼格式保存的類(lèi)文件,它內(nèi)部包含我們?cè)闯绦蛑械闹形淖址?,只不過(guò)此時(shí)它己經(jīng)由file.encoding格式轉(zhuǎn)化為UNICODE格式了。這一步中,對(duì)于JSP源程序文件是不同的,對(duì)于JSP,這個(gè)過(guò)程是這樣的:即WEB容器調(diào)用JSP編譯器,JSP編譯器先查看JSP文件中是否設(shè)置有文件編碼格式,如果JSP文件中沒(méi)有設(shè)置JSP文件的編碼格式,則JSP編譯器調(diào)用JDK先把JSP文件用JVM默認(rèn)的字符編碼格式(也即WEB容器所在的操作系統(tǒng)的默認(rèn)的file.encoding)轉(zhuǎn)化為臨時(shí)的Servlet類(lèi),然后再把它編譯成UNICODE格式的class類(lèi),并保存在臨時(shí)文件夾中。如:在中文win2k上,WEB容器就把JSP文件從GBK編碼格式轉(zhuǎn)化為UNICODE格式,然后編譯成臨時(shí)保存的Servlet類(lèi),以響應(yīng)用戶(hù)的請(qǐng)求。第三步,運(yùn)行第二步編譯出來(lái)的類(lèi),分為三種情況:A、 直接在console上運(yùn)行的類(lèi)B、 EJB類(lèi)和不可以直接運(yùn)行的支持類(lèi)(如JavaBean類(lèi))C、 JSP代碼和Servlet類(lèi)D、 JAVA程序和數(shù)據(jù)庫(kù)之間下面我們分這四種情況來(lái)看。A、直接在console上運(yùn)行的類(lèi)這種情況,運(yùn)行該類(lèi)首先需要JVM支持,即操作系統(tǒng)中必須安裝有JRE。運(yùn)行過(guò)程是這樣的:首先java啟動(dòng)JVM,此時(shí)JVM讀出操作系統(tǒng)中保存的class文件并把內(nèi)容讀入內(nèi)存中,此

時(shí)內(nèi)存中為UNICODE格式的class類(lèi),然后JVM運(yùn)行它,如果此時(shí)此類(lèi)需要接收用戶(hù)輸入,則類(lèi)會(huì)默認(rèn)用file.encoding編碼格式對(duì)用戶(hù)輸入的串進(jìn)行編碼并轉(zhuǎn)化為unicode保存入內(nèi)存(用戶(hù)可以設(shè)置輸入流的編碼格式)。程序運(yùn)行后,產(chǎn)生的字符串(UNICODE編碼的)再回交給JVM,最后JRE把此字符串再轉(zhuǎn)化為file.encoding格式(用戶(hù)可以設(shè)置輸出流的編碼格式)傳遞給操作系統(tǒng)顯示接口并輸出到界面上。對(duì)于這種直接在console上運(yùn)行的類(lèi),它的轉(zhuǎn)化過(guò)程可用圖1更加明確的表示出來(lái)圖1枝得操作系統(tǒng)的file,encoding它處于操作系統(tǒng)中內(nèi)容己轉(zhuǎn)化為sS ivac.exe它處于內(nèi)存中它處于內(nèi)存中中unicode格式飯入內(nèi)存將包含中文字符串的j宜&腐程岸從枝得操作系統(tǒng)的file,encoding它處于操作系統(tǒng)中內(nèi)容己轉(zhuǎn)化為sS ivac.exe它處于內(nèi)存中它處于內(nèi)存中中unicode格式飯入內(nèi)存將包含中文字符串的j宜&腐程岸從file.Rnzding?^化対的日噩觀(guān)鉀曹「內(nèi)存中創(chuàng)Z込褊碼的.」勿腐文件鶉菁豐靈 苫敲謬操作系統(tǒng)JKE平臺(tái)藐控

衆(zhòng)到上

作出臺(tái)

縮輸制、設(shè)置輸入漏碼格式侑輸入嗎》了嗎辛JKE平臺(tái)藐控

衆(zhòng)到上

作出臺(tái)

縮輸制、設(shè)置輸入漏碼格式侑輸入嗎》了嗎辛—r~encodine澤聽(tīng)出需碼了嗎?枝得嬴躺的如果滾舊‘理」 file,encoding轉(zhuǎn)化為操作系統(tǒng)的 |file.encodingHy?” _、 〔血平臺(tái)戻 運(yùn)行類(lèi)運(yùn)行產(chǎn)生uiticode褊碼的輸出串2以上每一步的轉(zhuǎn)化都需要正確的編碼格式轉(zhuǎn)化,才能最終不出現(xiàn)亂碼現(xiàn)象。B、EJB類(lèi)和不可以直接運(yùn)行的支持類(lèi)(如JavaBean類(lèi))由于EJB類(lèi)和不可以直接運(yùn)行的支持類(lèi),它們一般不與用戶(hù)直接交互輸入和輸出,它們常常與其它的類(lèi)進(jìn)行交互輸入和輸出,所以它們?cè)诘诙奖痪幾g后,就形成了內(nèi)容是UNICODE編碼的類(lèi)保存在操作系統(tǒng)中了,以后只要它與其它的類(lèi)之間的交互在參數(shù)傳遞過(guò)程中沒(méi)有丟失,則它就會(huì)正確的運(yùn)行。這種EJB類(lèi)和不可以直接運(yùn)行的支持類(lèi),它的轉(zhuǎn)化過(guò)程可用圖2更加明確的表示出來(lái):圖2C、JSP代碼和Servlet類(lèi)經(jīng)過(guò)第二步后,JSP文件也被轉(zhuǎn)化為Servlets類(lèi)文件,只不過(guò)它不像標(biāo)準(zhǔn)的Servlets一校存在于classes目錄中,它存在于WEB容器的臨時(shí)目錄中,故這一步中我們也把它做為Servlets對(duì)于Servlets,客戶(hù)端請(qǐng)求它時(shí),WEB容器調(diào)用它的JVM來(lái)運(yùn)行Servlet,首先,JVM把Servlet的class類(lèi)從系統(tǒng)中讀出并裝入內(nèi)存中,內(nèi)存中是以UNICODE編碼的Servlet類(lèi)的代碼,然后JVM在內(nèi)存中運(yùn)行該Servlet類(lèi),如果Servlet在運(yùn)行的過(guò)程中,需要接受從客戶(hù)端傳來(lái)的字符如:表單輸入的值和URL中傳入的值,此時(shí)如果程序中沒(méi)有設(shè)定接受參數(shù)時(shí)采用的編碼格式,則WEB容器會(huì)默認(rèn)采用ISO-8859-1編碼格式來(lái)接受傳入的值并在JVM中轉(zhuǎn)化為UNICODE格式的保存在WEB容器的內(nèi)存中。Servlet運(yùn)行后生成輸出,輸出的字符串是UNICODE格式的,緊接著,容器將Servlet運(yùn)行產(chǎn)生的UNICODE格式的串(如html語(yǔ)法,用戶(hù)輸出的串等)直接發(fā)送到客戶(hù)端瀏覽器上并輸出給用戶(hù),如果此時(shí)指定了發(fā)送時(shí)輸出的編碼格式,則按指定的編碼格式輸出到瀏覽器上,如果沒(méi)有指定,則默認(rèn)按ISO-8859-1編碼發(fā)送到客戶(hù)的瀏覽器上。這種JSP代碼和Servlet類(lèi),它的轉(zhuǎn)化過(guò)程可用圖3更加明確地表示出來(lái):圖3內(nèi)含中文操作丟統(tǒng)中以審主和h_file,encoding

字串和央T格式保存的Servlet

源文件文備碼file,encoding^■式讀入源程序到內(nèi)容中SFffip轉(zhuǎn)業(yè)肯晉iude、』 _ J 丘[1尺中漏匡程序1沒(méi)有J剛用file,encoding稻式的avac.exe設(shè)置了-enudin浚數(shù)嗎¥編譯后產(chǎn)生的Servlet類(lèi)或臨時(shí)的JSF產(chǎn)生的操作系統(tǒng)的file,encoding丿褊譯Servlet或JSF文件內(nèi)含中文字串和英文編碼WEB客器卜卩F源文件中設(shè)置了文件編碼格式了嗎?如果沒(méi)有,則file,encoding^^讀入源程序到內(nèi)客中'弄把它轉(zhuǎn)unicode格式的操作丟統(tǒng)中以file,encodingServlet類(lèi)j它們均是U1IICODE編碼的讀Aelm類(lèi)JVM虛擬機(jī)稻式W文件跟彩薦牒入1軟輸入f設(shè)置了枝' 7得輸入串的ServletgJVM運(yùn)行L褊碼格式了嗎??jī)?nèi)存中可以運(yùn)行的Unicode^碼的門(mén)込類(lèi)輸出設(shè)置了輸出的備瑪格式了嗎¥——輸出到用戶(hù)D、Java程序和數(shù)據(jù)庫(kù)之間瀏覽器上對(duì)于幾乎所有數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序,默認(rèn)的在JAVA程序和數(shù)據(jù)庫(kù)之間傳遞數(shù)據(jù)都是以ISO-8859-1為默認(rèn)編碼格式的,所以,我們的程序在向數(shù)據(jù)庫(kù)內(nèi)存儲(chǔ)包含中文的數(shù)據(jù)時(shí),JDBC首先是把程序內(nèi)部的UNICODE編碼格式的數(shù)據(jù)轉(zhuǎn)化為ISO-8859-1的格式,然后傳遞到數(shù)據(jù)庫(kù)中,在數(shù)據(jù)庫(kù)保存數(shù)據(jù)時(shí),它默認(rèn)即以ISO-8859-1保存,所以,這是為什么我們常常在數(shù)據(jù)庫(kù)中讀出的中文數(shù)據(jù)是亂碼。對(duì)于JAVA程序和數(shù)據(jù)庫(kù)之間的數(shù)據(jù)傳遞,我們可以用圖4清晰地表示出來(lái)

圖圖4JHBC在這里將Unicode的字符轉(zhuǎn)化為JHBC在這里將Unicode的字符轉(zhuǎn)化為i三0-8859-1的并在網(wǎng)絡(luò)上隹輸弔'mysqljSqlServerZK^數(shù)據(jù)庫(kù)在這里將接收到的串ili5Q-HH59-1格式存儲(chǔ)起來(lái)輸出的數(shù)據(jù)庫(kù)在這里將接收到的串ili5Q-HH59-1格式存儲(chǔ)起來(lái)3、分析常見(jiàn)的JAVA中文問(wèn)題幾個(gè)必須清楚的原則首先,經(jīng)過(guò)上面的詳細(xì)分析,我們可以清晰地看到,任何JAVA程序的生命期中,其編碼轉(zhuǎn)換的關(guān)鍵過(guò)程是在于:最初編譯成class文件的轉(zhuǎn)碼和最終向用戶(hù)輸出的轉(zhuǎn)碼過(guò)程。其次,我們必須了解JAVA在編譯時(shí)支持的、常用的編碼格式有以下幾種:*ISO-8859-1,8-bit,同8859_1,ISO-8859-1,ISO_8859_1等編碼*Cp1252,美國(guó)英語(yǔ)編碼,同ANSI標(biāo)準(zhǔn)編碼*UTF-8,同unicode編碼*GB2312,同gb2312-80,gb2312-1980等編碼*GBK,同MS936,它是gb2312的擴(kuò)充及其它的編碼,如韓文、日文、繁體中文等。同時(shí),我們要注意這些編碼間的兼容關(guān)體系如下:unicode和UTF-8編碼是——對(duì)應(yīng)的關(guān)系。GB2312可以認(rèn)為是GBK的子集,即GBK編碼是在gb2312上擴(kuò)展來(lái)的。同時(shí),GBK編碼包含了20902個(gè)漢字,編碼范圍為:0x8140-0xfefe,所有的字符可以一一對(duì)應(yīng)到UNICODE2.0中來(lái)。再次,對(duì)于放在操作系統(tǒng)中的.java源程序文件,在編譯時(shí),我們可以指定它內(nèi)容的編碼格式,具體來(lái)說(shuō)用-encoding來(lái)指定。注意:如果源程序中含有中文字符,而你用-encoding指定為其它的編碼字符,顯然是要出錯(cuò)的。用-encoding指定源文件的編碼方式為GBK或gb2312,無(wú)論我們?cè)谑裁聪到y(tǒng)上編譯含有中文字符的JAVA源程序都不會(huì)有問(wèn)題,它都會(huì)正確地將中文轉(zhuǎn)化為UNICODE存儲(chǔ)在class文件中。然后,我們必須清楚,幾乎所有的WEB容器在其內(nèi)部默認(rèn)的字符編碼格式都是以ISO-8859-1為默認(rèn)值的,同時(shí),幾乎所有的瀏覽器在傳遞參數(shù)時(shí)都是默認(rèn)以UTF-8的方式來(lái)傳遞參數(shù)的。所以,雖然我們的Java源文件在出入口的地方指定了正確的編碼方式,但其在容器內(nèi)部運(yùn)行時(shí)還是以ISO-8859-1來(lái)處理的。4、中文問(wèn)題的分類(lèi)及其建議最優(yōu)解決辦法了解以上JAVA處理文件的原理之后,我們就可以提出了一套建議最優(yōu)的解決漢字問(wèn)題的辦法。我們的目標(biāo)是:我們?cè)谥形南到y(tǒng)中編輯的含有中文字符串或進(jìn)行中文處理的JAVA源程序經(jīng)編譯后可以移值到任何其它的操作系統(tǒng)中正確運(yùn)行,或拿到其它操作系統(tǒng)中編譯后能正確運(yùn)行,能正確地傳遞中文和英文參數(shù),能正確地和數(shù)據(jù)庫(kù)交流中英文字符串。我們的具體思路是:在JAVA程序轉(zhuǎn)碼的入口和出口及JAVA程序同用戶(hù)有輸入輸出轉(zhuǎn)換的地方限制編碼方法使之正確即可。具體解決辦法如下:1、 針對(duì)直接在console上運(yùn)行的類(lèi)對(duì)于這種情況,我們建議在程序編寫(xiě)時(shí),如果需要從用戶(hù)端接收用戶(hù)的可能含有中文的輸入或含有中文的輸出,程序中應(yīng)該采用字符流來(lái)處理輸入和輸出,具體來(lái)說(shuō),應(yīng)用以下面向字符型節(jié)點(diǎn)流類(lèi)型:對(duì)文件:FileReader,F(xiàn)ileWrieter其字節(jié)型節(jié)點(diǎn)流類(lèi)型為:FileInputStream,F(xiàn)ileOutputStream對(duì)內(nèi)存(數(shù)組):CharArrayReader,CharArrayWriter其字節(jié)型節(jié)點(diǎn)流類(lèi)型為:ByteArrayInputStream,ByteArrayOutputStream對(duì)內(nèi)存(字符串):StringReader,StringWriter對(duì)管道:PipedReader,PipedWriter其字節(jié)型節(jié)點(diǎn)流類(lèi)型為:PipedInputStream,PipedOutputStream同時(shí),應(yīng)該用以下面向字符型處理流來(lái)處理輸入和輸出BufferedWriter,BufferedReader其字節(jié)型的處理流為:BufferedlnputeStream,BufferedOutputStreamlnputStreamReader,OutputStreamWriter其字節(jié)型的處理流為:DatalnputStream,DataOutputStream其中InputStreamReader和InputStreamWriter用于將字節(jié)流按照指定的字符編碼集轉(zhuǎn)換到字符流,如:InputStreamReaderin=newInputStreamReader(System.in,"GB2312");OutputStreamWriterout=newOutputStreamWriter(System.out,"GB2312");例如:采用如下的示例JAVA編碼就達(dá)到了要求://Read.javaimportjava.io.*;publicclassRead{publicstaticvoidmain(String[]args)throwsIOException{Stringstr="\n中文測(cè)試,這是內(nèi)部硬編碼的串"+"\ntestenglishcharacter";Stringstrin="";BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in,"gb2312"));//設(shè)置輸入接口按中文編碼BufferedWriterstdout=newBufferedWriter(newOutputStreamWriter(System.out,"gb2312"));//設(shè)置輸出接口按中文編碼stdout.write("請(qǐng)輸入:");stdout.flush();strin=stdin.readLine();stdout.write("這是從用戶(hù)輸入的串:"+strin);stdout.write(str);stdout.flush();}}同時(shí),在編譯程序時(shí),我們用以下方式來(lái)進(jìn)行:javac-encodinggb2312Read.java其運(yùn)行結(jié)果如圖5所示:阿C:\WINNT\5y5tem32\cmd.eMeC:Xj2sdkl.4.1_01>jauac-encodinggb2312Read.JavaC:Xj2sdkl.4.1_01>jauaRead請(qǐng)輸入:測(cè)試中文+testenglish憶星從角戶(hù)輸人的串:測(cè)殺中文+testenglish中文測(cè)試,龍是內(nèi)部硬編碼術(shù)串testenglishcharacterC:\j2sdkl.4.1_01>圖52、針對(duì)EJB類(lèi)和不可以直接運(yùn)行的支持類(lèi)(如JavaBean類(lèi))由于這種類(lèi)它們本身被其它的類(lèi)調(diào)用,不直接與用戶(hù)交互,故對(duì)這種類(lèi)來(lái)說(shuō),我們的建議的處理方式是內(nèi)部程序中應(yīng)該采用字符流來(lái)處理程序內(nèi)部的中文字符串(具體如上面一節(jié)中一樣)同時(shí),在編譯類(lèi)時(shí)用-encodinggb2312參數(shù)指示源文件是中文格式編碼的即可。3、 針對(duì)Servlet類(lèi)針對(duì)Servlet,我們建議用以下方法:在編譯Servlet類(lèi)的源程序時(shí),用-encoding指定編碼為GBK或GB2312,且在向用戶(hù)輸出時(shí)的編碼部分用response對(duì)象的setContentType(“text/html;charset=GBK");或gb2312來(lái)設(shè)置輸出編碼格式,同樣在接收用戶(hù)輸入時(shí),我們用request.setCharacterEncoding("GB2312");這樣無(wú)論我們的servlet類(lèi)移植到什么操作系統(tǒng)中,只有客戶(hù)端的瀏覽器支持中文顯示,就可以正確顯示。如下是一個(gè)正確的示例://HelloWorld.javapackagehello;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassHelloWorldextendsHttpServlet{publicvoidinit()throwsServletException{}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{request.setCharacterEncoding("GB2312");//設(shè)置輸入編碼格式response.setContentType("text/html;charset=GB2312");//設(shè)置輸出編碼格式PrintWriterout=response.getWriter();//建議使用PrintWriter輸出out.println("<hr>");out.println("HelloWorld!ThisiscreatedbyServlet!測(cè)試中文!");out.println("<hr>");}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{request.setCharacterEncoding("GB2312");//設(shè)置輸入編碼格式response.setContentType("text/html;charset=GB2312");//設(shè)置輸出編碼格式Stringname=request.getParameter("name");Stringid=request.getParameter("id");if(name==null)name="";if(id==null)id="";PrintWriterout=response.getWriter();//建議使用PrintWriter輸出out.println("<hr>");out.println("你傳入的中文字串是:"+name);out.println("<hr>你輸入的id是:"+id);out.println("<hr>");}publicvoiddestroy(){}}請(qǐng)用javac-encodinggb2312HelloWorld.java來(lái)編譯此程序。測(cè)試此Servlet的程序如下所示:<%@pagecontentType="text/html;charset=gb2312"%><%request.setCharacterEncoding("GB2312");%><html><head><title></title><Scriptlanguage="JavaScript">functionSubmit(){//通過(guò)URL傳遞中文字符串值給Servletdocument.base.action二"./HelloWorld?name二中文";document.base.method="POST";document.base.submit();}</Script></head><bodybgcolor="#FFFFFF"text="#000000"topmargin="5"><formname="base"method="POST"target="_self"><inputname="id"type="text"value=""size="30"><ahref="JavaScript:Submit()">傳給Servlet</a></form></body></html>其運(yùn)行結(jié)果如圖6所示:圖64、 JAVA程序和數(shù)據(jù)庫(kù)之間為避免JAVA程序和數(shù)據(jù)庫(kù)之間數(shù)據(jù)傳遞出現(xiàn)亂碼現(xiàn)象,我們建議采用以下最優(yōu)方法來(lái)處理:、對(duì)于JAVA程序的處理方法按我們指定的方法處理。、把數(shù)據(jù)庫(kù)默認(rèn)支持的編碼格式改為GBK或GB2312的。如:在mysql中,我們可以在配置文件my.ini中加入以下語(yǔ)句實(shí)現(xiàn):在[mysqld]區(qū)增加:default-character-set=gbk并增加:[client]default-character-set=gbk在SQLServer2K中,我們可以將數(shù)據(jù)庫(kù)默認(rèn)的語(yǔ)言設(shè)置為SimplifiedChinese來(lái)達(dá)到目的。5、 針對(duì)JSP代碼由于JSP是在運(yùn)行時(shí),由WEB容器進(jìn)行動(dòng)態(tài)編譯的,如果我們沒(méi)有指定JSP源文件的編碼格式,則JSP編譯器會(huì)獲得服務(wù)器操作系統(tǒng)的file.encoding值來(lái)對(duì)JSP文件編譯的,它在移植時(shí)最容易出問(wèn)題,如在中文win2k中可以很好運(yùn)行的jsp文件拿到英文linux中就不行,盡管客戶(hù)端都是一樣的,那是因?yàn)槿萜髟诰幾gJSP文件時(shí)獲取的操作系統(tǒng)的編碼不同造成(在中文wink中的file.encoding和在英文Linux中file.encoding是不同的,且英文Linux的file.encoding對(duì)中文不支持,所以編譯出來(lái)的JSP類(lèi)就會(huì)有問(wèn)題)。網(wǎng)絡(luò)上討論的大多數(shù)是此類(lèi)問(wèn)題,多是因?yàn)镴SP文件移植平臺(tái)時(shí)不能正確顯示的問(wèn)題,對(duì)于這類(lèi)問(wèn)題,我們了解了JAVA中程序編碼轉(zhuǎn)換的原理,解決起來(lái)就容易多了。我們建議的解決辦法如下:1、我們要保證JSP向客戶(hù)端輸出時(shí)是采用中文編碼方式輸出的,即無(wú)論如何我們首先在我們的JSP源代編中加入以下一行:<%@pagecontentType="text/html;charset=gb2312"%>2、為了讓JSP能正確獲得傳入的參數(shù),我們?cè)贘SP源文件頭加入下面一句:<%request.setCharacterEncoding("GB2312");%>、為了讓JSP編譯器能正確地解碼我們的含有中文字符的JSP文件,我們需要在JSP源文件中指定我們的JSP源文件的編碼格式,具體來(lái)說(shuō),我們?cè)贘SP源文件頭上加入下面的一句即可:<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論