張 劍
(山西職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)系,山西 太原 030006)
基于JSP技術(shù)的中文亂碼原因分析及對(duì)策研究
張 劍
(山西職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)系,山西 太原 030006)
JSP是一種被廣泛應(yīng)用于動(dòng)態(tài)網(wǎng)頁制作開發(fā)的技術(shù)。在網(wǎng)頁設(shè)計(jì)與實(shí)現(xiàn)的過程中由于網(wǎng)頁編碼的復(fù)雜性,中文頁面在最終客戶端顯示時(shí)經(jīng)常會(huì)出現(xiàn)亂碼的情況。本文對(duì)基于JSP技術(shù)開發(fā)的中文頁面顯示亂碼的情況進(jìn)行了分析并逐一提出了切實(shí)可行的解決方案。
JSP;中文亂碼;分析;對(duì)策
JSP的全稱為Java Server Pages,它是由Sun公司提出,多家公司參與建立的動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。它在本質(zhì)上就是一個(gè)Java Servlet,即用Java編寫的可以在服務(wù)器端運(yùn)行的程序。它允許在傳統(tǒng)的HTML代碼中嵌入Java程序段,通過編譯、執(zhí)行以實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁的功能。JSP繼承了Java語言的簡(jiǎn)單易用、完全面向?qū)ο蠹翱缙脚_(tái)性,因此很多大公司都在利用JSP開發(fā)動(dòng)態(tài)網(wǎng)頁。
全世界各個(gè)國(guó)家都在使用各自的語言進(jìn)行網(wǎng)頁的設(shè)計(jì)與制作,從而產(chǎn)生了紛繁復(fù)雜的編碼問題。而在我國(guó),由于中文字符采用了特殊的編碼方式,因此,在開發(fā)設(shè)計(jì)中文網(wǎng)頁的過程中,可能會(huì)出現(xiàn)中文亂碼的情況,而網(wǎng)頁出現(xiàn)亂碼的原因也是比較復(fù)雜。因此,本文著重分析了多種中文亂碼現(xiàn)象產(chǎn)生的原因并提出了應(yīng)對(duì)策略,從而為廣大的JSP網(wǎng)頁開發(fā)人員提供參考。需要說明的是,本文中所使用的網(wǎng)頁服務(wù)器為Tomcat,數(shù)據(jù)庫服務(wù)器為MySql,其他同類服務(wù)器可以進(jìn)行類比操作。
1.1 Latin-1
Latin-1是ISO-8859-1編碼的別名,它占用一個(gè)字節(jié)的編碼長(zhǎng)度,其中0-127為ASCⅡ碼。這個(gè)字符集支持的主要是歐洲的部分國(guó)家所使用的語言。由于這個(gè)編碼完美地占用了一個(gè)字節(jié)的所用空間,因此用其他任何編碼形式傳輸?shù)淖止?jié)流都可以通過Latin-1進(jìn)行傳輸而不會(huì)被丟棄。在本文的第二部分介紹了專門利用Latin-1進(jìn)行轉(zhuǎn)碼的實(shí)例,利用Latin-1進(jìn)行轉(zhuǎn)碼可以稱為是解決編碼問題的最后方案。
1.2 GB2312
GB2312是由中國(guó)國(guó)家標(biāo)準(zhǔn)總局于1980年發(fā)布的。它規(guī)定兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)漢字,前面的一個(gè)字節(jié)(也稱之為高字節(jié))從0xA1用到0xF7,后面一個(gè)字節(jié)(也稱之為低字節(jié))從0xA1到0xFE。這樣共可容納7000多個(gè)簡(jiǎn)體漢字,其中包括一級(jí)漢字3755個(gè),二級(jí)漢字3008個(gè)。
1.3 GBK
GBK是1995年發(fā)布的,它向下兼容GB2312,共包含簡(jiǎn)體漢字、繁體漢字、各種字符等21000多個(gè)。
1.4 GB18030
GB18030有兩個(gè)版本,分別是GB18030-2000和GB18030-2005。其中GB18030-2000是2000年發(fā)布的GBK的替代版本,而GB18030-2005是2005年發(fā)布的以漢字為主并包含多種我國(guó)少數(shù)民族文字,共收錄漢字70000余個(gè)。
1.5 UTF-8
為了解決各個(gè)國(guó)家不同文字和符號(hào)的編碼問題,國(guó)際標(biāo)準(zhǔn)化組織于1994年提出了UNICODE編碼。而UNICODE代碼在網(wǎng)絡(luò)上傳輸時(shí)又出現(xiàn)了兩個(gè)標(biāo)準(zhǔn)UTF-8和UTF-16,其中分別代表著每次傳輸8位和每次傳輸16位。由于國(guó)際化的需求,因此目前網(wǎng)頁編碼很多使用UTF-8。
2.1 MyEclipse或Eclipse編輯頁面中出現(xiàn)亂碼
原因分析:這個(gè)問題較為常見,主要是由于用戶安裝的MyEclipse或Eclipse默認(rèn)JSP編輯頁面的編碼方式為ISO-8859-1,因此,在打開其他編輯器生成的JSP文件時(shí)可能會(huì)出現(xiàn)亂碼。另外,如果是在MyEclipse或Eclipse里編輯JSP頁面,如果開發(fā)工具默認(rèn)的頁面編碼方式不支持JSP頁面中出現(xiàn)的字符,則會(huì)提示保存失敗,必須對(duì)編碼方式進(jìn)行修改或去掉編碼方式無法解析的字符后才能正確保存。
解決對(duì)策:可去相應(yīng)開發(fā)工具中找到“window”|“Preferences”|“General”|“Editors”|“Text Editors”|“Spelling”下面的Encoding選項(xiàng),將其指選擇為“GBK”后選擇Apply后點(diǎn)擊OK。然后重新啟動(dòng)MyEclipse或Eclipse再進(jìn)行嘗試,發(fā)現(xiàn)亂碼問題解決。
2.2 JSP頁面中文亂碼
原因分析:JSP頁面在被請(qǐng)求之后,需要經(jīng)歷三個(gè)階段才會(huì)在客戶端進(jìn)行顯示。首先是由JSP頁面編譯成JAVA,這個(gè)階段會(huì)根據(jù)參數(shù)pageEncoding的設(shè)定讀取JSP文件,結(jié)果由指定的編碼方式轉(zhuǎn)換為統(tǒng)一的UTF-8編碼,如果pageEncoding沒設(shè)定或設(shè)定錯(cuò)誤將導(dǎo)致中文亂碼。其次是JAVA源碼編譯為二進(jìn)制碼即.class文件,這個(gè)過程均采用UTF-8編碼。最后是Tomcat載入和執(zhí)行.class文件,輸出結(jié)果也就是客戶端所見到的頁面,此時(shí)頁面的編碼將利用contentType中指定的charset的編碼方式進(jìn)行展示。因此,JSP頁面出現(xiàn)中文亂碼,應(yīng)對(duì)以上兩個(gè)參數(shù)進(jìn)行設(shè)置。
解決對(duì)策:應(yīng)使用JSP的page指令,指定JSP文檔的字符編碼方式及在客戶端顯示時(shí)采用的編碼方式,格式如下:<%@ page language=”java” contentType = ”text/html;charset = gbk” pageEncoding=”gbk” %>。然后重新嘗試,發(fā)現(xiàn)亂碼問題解決。
2.3 URL中文參數(shù)傳遞出現(xiàn)亂碼
原因分析:數(shù)據(jù)在網(wǎng)頁之間經(jīng)常需要進(jìn)行傳遞,而數(shù)據(jù)在頁面之間傳遞的時(shí)候如果使用的是get方法提交,也就是使用“URL參數(shù)名=’參數(shù)值’”的方式提交的話,并且參數(shù)值為中文字符,則很可能會(huì)出現(xiàn)亂碼的情況。這個(gè)亂碼不是由于頁面或顯示的編碼問題,而是因?yàn)門omcat服務(wù)器參數(shù)配置中URIEncoding的設(shè)置不支持中文字符,因此會(huì)導(dǎo)致中文參數(shù)傳遞出現(xiàn)亂碼。如圖1所示。
圖1 URL中文參數(shù)傳遞出現(xiàn)亂碼
解決對(duì)策: 進(jìn)入Tomcat目錄,在conf目錄下打開server.xml文件。找到Connector標(biāo)簽,在其后參數(shù)中添加URIEncoding="gbk"。然后保存,退出,將Tomcat服務(wù)器重新啟動(dòng),再進(jìn)行嘗試,發(fā)現(xiàn)亂碼問題解決。
2.4 表單傳遞參數(shù)出現(xiàn)亂碼
原因分析:表單通過post方法提交數(shù)據(jù)后,處理頁面可以通過request.getParameter()方法獲取所傳遞的數(shù)據(jù)轉(zhuǎn)換為字符串之后的值,但是得到的字符串的默認(rèn)編碼方式為ISO-8859-1,因此會(huì)出現(xiàn)亂碼。如圖2所示。
圖2 表單傳遞參數(shù)出現(xiàn)亂碼
解決對(duì)策主要有如下兩種:
1) 設(shè)置request.setCharacterEncoding參數(shù):在處理頁面內(nèi)添加代碼<%request.setCharacterEncoding("gbk");%>。這段代碼指定了通過request方式獲得表單傳遞來各參數(shù)的編碼方式。值得注意的是,這段代碼應(yīng)當(dāng)安放在使用request.getParameter()獲取表單參數(shù)之前。反之,如果在其之后,則不會(huì)起任何作用。進(jìn)行重試,發(fā)現(xiàn)亂碼問題解決。
2) 進(jìn)行轉(zhuǎn)碼:前文提過,ISO-8859-1編碼完美地占用了一個(gè)字節(jié)的所用空間,因此用其他任何編碼形式傳輸?shù)淖止?jié)流都可以通過Latin-1進(jìn)行傳輸而不會(huì)被丟棄。為此,理論上,任何編碼方式最終都可以轉(zhuǎn)化為ISO-8859-1編碼進(jìn)行傳輸,傳輸完畢之后再按數(shù)據(jù)實(shí)際占用大小重新組合,從而實(shí)現(xiàn)轉(zhuǎn)碼。具體步驟如下:首先將從表單獲取的值保存String username = request.getParameter("username");,其次將這個(gè)字符串按照ISO-8859-1的編碼方式生成一個(gè)字節(jié)數(shù)組username.getBytes("ISO-8859-1"),然后利用指定字節(jié)數(shù)組和編碼方式的String的構(gòu)造方法構(gòu)造新的字符串new String(username.getBytes("ISO-8859-1"), "gbk"),最后將收到的字符串顯示出來從而完成轉(zhuǎn)碼。進(jìn)行測(cè)試,發(fā)現(xiàn)亂碼問題解決。
2.5 數(shù)據(jù)庫讀取數(shù)據(jù)出現(xiàn)中文亂碼
原因分析及解決對(duì)策:在讀取數(shù)據(jù)庫內(nèi)容后出現(xiàn)中文亂碼的情況較為復(fù)雜。讀者應(yīng)首先分析在向數(shù)據(jù)庫中插入數(shù)據(jù)前,字符是否正常。如果插入前就已是亂碼,則應(yīng)按前述步驟進(jìn)行檢查并修正。其次,如果是插入后成為亂碼,則要考慮MySql數(shù)據(jù)庫安裝時(shí)選擇了什么編碼方式,默認(rèn)為L(zhǎng)atin1,應(yīng)設(shè)置為utf8。安裝成功后可以使用命令show variables like 'character%';進(jìn)行查詢,這里的結(jié)果除了filesystem選項(xiàng)為binary之外其他都應(yīng)顯示為utf8。再次,在創(chuàng)建數(shù)據(jù)庫及數(shù)據(jù)表時(shí)都應(yīng)使用character set utf8指定其編碼方式。根據(jù)以上步驟操作完后,重新訪問,發(fā)現(xiàn)亂碼問題解決。
JSP是目前使用較普遍的開發(fā)動(dòng)態(tài)網(wǎng)頁的技術(shù),亂碼問題也是程序設(shè)計(jì)中經(jīng)常困擾開發(fā)人員的一件事。本文就一些常見的亂碼問題進(jìn)行了細(xì)致的原因分析并提出了切實(shí)可行的解決方案??偟膩碚f,在JSP應(yīng)用中出現(xiàn)亂碼問題,程序人員應(yīng)當(dāng)根據(jù)出現(xiàn)亂碼的位置及特點(diǎn)進(jìn)行細(xì)致合理的分析,找出產(chǎn)生亂碼的原因,繼而能準(zhǔn)確地提出解決方案。
[1] 楊俊峰.輕松解決JSP頁面中文亂碼[J].才智,2011(23):75.
[2] 楊昭兵.基于JSP WEB動(dòng)態(tài)網(wǎng)頁技術(shù)中中文亂碼問題及解決方案[J].甘肅科技縱橫,2010(6):40-41.
[3] 李響,郝靜靜.Java Web開發(fā)中文亂碼問題的研究與解決[J].電腦知識(shí)與技術(shù),2012(1):62-63.
[4] 劉歡杰,魏靜敏.關(guān)于JSP亂碼問題分析總結(jié)[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2012(6):206-207.
[5] 賈文瀟,葉慧莉.Java Web開發(fā)中的亂碼問題[J].電子測(cè)試,2016(6):64-65.
[6] 梅錦峰,陽小蘭,錢程,等.JSP初學(xué)者遇到的中文亂碼問題及解決方案[J].黑龍江科技信息,2016(4):180.
Research on the Analysis and Corresponding Countermeasure of Chinese Garbled Based on JSP Technology
Zhang Jian
(ShanxiVocationalandTechnicalCollege,TaiyuanShanxi030006,China)
JSP is a kind of technology which is widely used in the development of dynamic web page. During the process of web design and implementation, Chinese web pages often appear the garbled in the final client displays because of the complexity of web page code. The article makes analysis on the garbled conditions that displaying in Chinese page based on JSP technology and proposes practical solution one by one.
JSP; Chinese garbled; analysis; countermeasure
2016-09-02
張 劍(1981- ),男,山西介休人,講師,碩士,主要研究方向:計(jì)算機(jī)軟件應(yīng)用。
1674- 4578(2016)06- 0075- 02
TP393.092
A