資源描述:
《對(duì)java程序中的中文亂碼問(wèn)題的解決方法》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、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ó)際版的JD
2、K,我們大多數(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),它們采用的是GBK,GB2312編碼格式以正確顯示我們的漢字。如:中文Win2K默認(rèn)采用的是GBK編碼顯示,在中文WIN2k中保存文件時(shí)默認(rèn)采用的保存文件的編碼格式也是GBK的,即,所有在中文WIN2K中保存的文件它的內(nèi)部編碼默認(rèn)均采用GBK編碼,注意:GBK是在GB231
3、2基礎(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)中文
4、問(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)題。軟件開(kāi)發(fā)網(wǎng)www.mscto.com2、JAVA編碼轉(zhuǎn)換的詳細(xì)過(guò)程我們常見(jiàn)的JAVA程序包括以下類(lèi)別:*直接在console上運(yùn)行的類(lèi)(包括可視化界面的類(lèi))*JS
5、P代碼類(lèi)(注:JSP是Servlets類(lèi)的變型)*Servelets類(lèi)*EJB類(lèi)*其它不可以直接運(yùn)行的支持類(lèi)軟件開(kāi)發(fā)網(wǎng)www.mscto.com這些類(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源程序;*編
6、程人員用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)編碼和被解碼的。軟件開(kāi)發(fā)網(wǎng)www.mscto.com第一步,我們?cè)谥形膚in2k中用編輯軟件如記事本編寫(xiě)一個(gè)Java源程序文件(包括以上五類(lèi)JAVA程序),程序文件在保存時(shí)默認(rèn)采用了操作系統(tǒng)默認(rèn)支持GBK編碼格式(操作系統(tǒng)默認(rèn)支持的格式為file.
7、encoding格式)形成了一個(gè).java文件,也即,java程序在被編譯前,我們的JAVA源程序文件是采用操作系統(tǒng)默認(rèn)支持的file.encoding編碼格式保存的,java源程序中含有中文信息字符和英文程序代碼;要查看系統(tǒng)的file.encoding參數(shù),可以用以下代碼:publicclassShowSystemDefaultEncoding{軟件開(kāi)發(fā)網(wǎng)www.mscto.compublicstaticvoidmain(String[]args){Stringencoding=System.getProperty("file.encoding");Sy
8、stem.out.println(encoding);}}第二步,