【摘 要】Java是由Sun Microsystems公司所開發(fā)的程序設(shè)計語言,至今已經(jīng)有將近20年的歷史,在這20年間Java取得了很大的發(fā)展并廣泛應(yīng)用于PC、數(shù)據(jù)中心、互聯(lián)網(wǎng)等行業(yè)。如今隨著智能手機行業(yè)的發(fā)蓬勃發(fā)展再一次帶給了Java巨大的應(yīng)用空間。本文對Java編程的中文問題進行了闡述,并提出了相關(guān)的解決方案。
【關(guān)鍵詞】Java語言 中文問題 GB2312
從客觀上來看每個區(qū)域計算機信息交換所采取的字符編碼集都是不同的。一般情況下字符編碼集都是按照長度來進行分類,主要包括了兩類即單字節(jié)字符集(SBCS)以及雙字節(jié)字符集(DBCS)。Java主要是使用UNICODE編碼,因此當(dāng)Java在實際工作的過程中就會存在一個編碼格式轉(zhuǎn)換輸入、輸出的過程,這個過程是實施信息數(shù)據(jù)交換的重要過程,一旦出現(xiàn)問題就會使得中文出現(xiàn)亂碼的情況,這給用戶和開發(fā)者都會帶來較為不利的影響,這也是Java編程中文問題的主要體現(xiàn)。
一、Java主要的編碼方式
如果要想解決Java編程所存在的問題首先要對Java主要的編碼方式進行分析。16位無符號型數(shù)據(jù)是Java中的主要字符數(shù)據(jù),它同時包括了ASCⅡ集以及Unicode集,這也就為程序帶來了相應(yīng)的標(biāo)準(zhǔn),給開發(fā)者帶來了更大便利。但是在Java處理信息數(shù)據(jù)的過程中基本上都是英文,事實上7位的ASCⅡ集已經(jīng)足夠使用,而采用Unicode集相對來說就占用了更大的儲存空間,同時也讓基于Java的軟件的穩(wěn)定性受到了一定程度的影響。而Java編程的中文問題主要還是因為信息數(shù)據(jù)在字符轉(zhuǎn)換過程中存在錯誤所導(dǎo)致的。Java主要的編碼方式包括了以下幾種分別為:GB2312、Unicode、ISO8859-1、 GBK、GB1803-2000(GBKZK)以及UTF-8。其中GB2312是一種較為典型的Java編碼方式,并且有著較為廣泛的使用,也被大多數(shù)用戶所熟知,同時它與中文編碼有著密切的聯(lián)系[1]。GB2312是一種雙字節(jié)內(nèi)碼,它容納了大量的一、二級漢字以及 9區(qū)的符號,作為最基本的中文字符集,它具有較好的兼容性并且絕大部分的軟件與中文系統(tǒng)都能夠支持該中文字符集。當(dāng)然GB2312也有著一定的編碼范圍,低位范圍是從0xal至0xfe;高位范圍是0xal至0xfe;漢字的范圍是從0xb0al至0xf7fe。GBK作為GB2312編碼的延伸也包含了相當(dāng)數(shù)量的漢字,它的編碼范圍是從0x8140至0xfefe,并且GBK上的字符可以與Unicode形成相應(yīng)的映射,這樣就使得GBK能夠兼容于Java。,當(dāng)前它正應(yīng)用于一些系統(tǒng)的缺省字符集。另外GBK2K作為GBK的擴展帶來了更可靠的漢字?jǐn)U展方案,這也就給字位不夠以及字位不足的問題帶來了良好的解決方案。
二、Java編程中文問題產(chǎn)生的主要因素。
在Java語言編程、設(shè)計的過程中某些時候會碰到出現(xiàn)中文亂碼的情況,而造成這種情況的主要因素還是因為不同編碼之間的相互轉(zhuǎn)換所存在的錯誤所造成的。當(dāng)程序中涉及到JSP或者是Servlet時,一般情況下會通過get Parameter (String name)來對相關(guān)的參數(shù)進行訪問,但是反饋的卻是從網(wǎng)絡(luò)端所得到的由字節(jié)流解碼所帶來的字串符[1]。而正是因為服務(wù)器不能夠?qū)@些字串符進行良好的駕馭也就使得服務(wù)器解碼出現(xiàn)了一定程度的問題。從數(shù)據(jù)傳播的流程來看(String經(jīng)過encoder→ByteStream→Internet→ByteStream再經(jīng)過decoder→String→Servlet),如果encoder步驟與decoder步驟能夠保證高度一致的話就能夠讓解碼更為準(zhǔn)確,這樣就不會產(chǎn)生中文字符出現(xiàn)亂碼的問題。但是由于服務(wù)器作用的局限性,會使得encoder以及decoder出現(xiàn)偏差,這樣就會讓數(shù)據(jù)轉(zhuǎn)換出錯,從而導(dǎo)致亂碼。舉例來說在漢字當(dāng)中“你”字的GB編碼為0Xe4e3,其二進制編碼為1100010 11100011,它的Unicode碼為0X4f60,其二進制編碼為01001111 01100000。從上述實例就可以看出GB編碼與Unicode碼在表達同一個中文字符的時候完全是采用了兩種不同方式,同時兩者之間并沒有所對應(yīng)的轉(zhuǎn)換規(guī)律,這就直接導(dǎo)致了中文亂碼的產(chǎn)生[3]。
三、Java編程中文問題的具體解決方案
Java編程中文問題的具體解決方案主要如下:
(一)在jsp網(wǎng)頁中對輸出字符集進行重新定義。當(dāng)前主流的瀏覽器都是以UTF-8編碼方式來進行數(shù)據(jù)信息的傳送,當(dāng)中文字符不能正常顯示的時候可以將初始的字符集變更為GB2312,這樣就可以有效地避免亂碼情況。一般是在頁面開頭處加入meta信息,這樣就能夠讓頁面以GB2312方式來進行相應(yīng)的輸出,保證中文輸出的可靠性[4]。
(二)將中文GBK碼以及Unicode 碼進行相對應(yīng)的轉(zhuǎn)換。
(三)將數(shù)據(jù)庫所默認(rèn)支持的編碼格式轉(zhuǎn)變?yōu)镚BK以及GB2312。當(dāng)存在SQL Server2000時,可以對數(shù)據(jù)庫的默認(rèn)語言進行重新設(shè)置,將其變更為Simplified Chinese從而對編碼進行相應(yīng)的改寫。
(四)以RandomAccessFile類的 writeUTF 方法對數(shù)據(jù)進行寫入并使用readUTF對數(shù)據(jù)進行讀取或者在數(shù)據(jù)寫入時將Unicode 字符轉(zhuǎn)變?yōu)镚B碼字符串,在數(shù)據(jù)讀取時轉(zhuǎn)回GB碼字符,這樣就可以對中文文本文件進行正常的讀寫,并且可以避免亂碼的出現(xiàn)。
四、結(jié)語
造成Java編程中文問題的主要因素還是因為不同編碼之間的相互轉(zhuǎn)換所存在的錯誤所造成的。通過對這一環(huán)節(jié)進行處理,采用相關(guān)的手段去遏制編碼轉(zhuǎn)換所存在的錯誤,這樣就能夠有效地預(yù)防Java編程中所存在的中文問題。
參考文獻:
[1]蘇蘊.關(guān)于Java Web技術(shù)開發(fā)中中文亂碼問題的深入探討[J].福建電腦.2010(08).
[2]馮金輝,朱淼良.Java編碼中文問題研究及解決方案[J].計算機系統(tǒng)應(yīng)用.2010(11).
[3]韋忠亮.JSP亂碼問題探討[J].中小企業(yè)管理與科技(上旬刊).2011(11).
[4]李玉紅,巴一,甄玉杰.Java程序中文編碼問題與解決方案[J].承德醫(yī)學(xué)院學(xué)報.2010(12).