張彥芳

摘要:在當下的網絡時代,Java Web技術發展迅速,已經成為市場上主流的web開發技術之一,為越來越多的web應用開發人員所使用。但是,在進行Java Web項目開發時,經常出現的中文亂碼問題給應用開發帶來了不少的麻煩。該文具體分析了Java Web項目開發中常見的中文亂碼問題,并給出了相應的對策。
關鍵詞:中文亂碼;編碼;解碼;Servlet
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2020)09-0096-02
1 引言
目前,網絡高速發展,web開發應用非常廣泛,Java Web成為市場上非常流行的web開發技術之一,越來越多的人開始學習并使用Java web開發項目。但是,我們在使用Java web技術開發項目時不可避免用到中文,在Java web中使用中文經常會出現中文亂碼問題,嚴重影響了項目的開發與應用,解決中文亂碼問題迫不及待。本文具體分析了實際應用中遇到的中文亂碼問題,并給出了相應的對策。
2 產生中文亂碼的原因
計算機中存儲數據都是以二進制的形式存儲。當我們輸入中文字符時,需要把中文字符轉換成二進制進行存儲,這時就會發生字符和字節之間的轉換。將字符轉換成字節的過程,我們稱為編碼,將字節轉換成字符的過程稱為解碼。無論是編碼還是解碼,字符與字節之間的轉換都是通過查碼表來完成的,如果在解碼時采用的碼表和編碼時采用的碼表不一致,就會產生亂碼的問題。
3 Java Web中常見的中文亂碼問題與對策
3.1訪問JSP頁面時出現中文亂碼
通過瀏覽器訪問JSP頁面時,經常會在瀏覽器中看到亂碼,出現亂碼的根本原因是使用的編碼不支持中文。在JSP頁面中使用的編碼默認為“IS0-8859-1”,這種編碼方式不兼容中文字符。常用的支持中文字符的編碼有GB2312,GBK和UTF-8。我們可以在JSP文件的page指令中將編碼修改為支持中文的編碼即可。例如:< %@page pageEncoding=”UTF-8”%>.
這種方式,每次新建JSP文件時,都要在page指令中設置編碼,比較麻煩。如果使用的是Eclipse軟件開發java Web項目的話,可以直接修改JSP頁面的默認編碼為UTF-8。方法為:在Windows菜單下選擇preferences,在其級聯菜單下選擇Web,并在web的子菜單JSP Files中謾置Encoding為UTF-8,這樣設置后,再新建JSP文件,文件默認的編碼就變為UTF-8了。
3.2 中文輸出亂碼問題
在Servlet中輸人中文字符時,如果在瀏覽器頁面看到的內容是若干個“?”,就說明產生了中文亂碼。那么,這個亂碼是如何產生的呢?當我們使用response對象的輸出流進行編碼時,采用的是IS0-8859-1的字符碼表,這個字符表是不支持中文的,這時在IS0-8859-1字符碼表中就查不到中文字符對應的碼,當查不到的時候就會給這些中文字符統一編碼為對應個數的“63”。瀏覽器接收到數據后進行解碼,瀏覽器解碼時會采用默認的支持中文字符的字符碼表GB2312,在GB2312字符表中,“63”對應的字符是“?”,將“63”解碼為“?”,就產生了亂碼。具體分析過程見圖1。
解決這種輸出亂碼問題有兩種方法:一是可以使用HttpServletResponse接口提供的setCharacterEncoding0方法,設置字符的編碼方式。我們知道UTF-8字符集支持中文,我們通過代碼設置字符的編碼方式為字符碼表UTF-8,在瀏覽器中設置瀏覽器的編碼方式也為UTF-8,這樣就能解決這個中文亂碼問題。二是不管編碼還是解碼方式都使用HttpServletResponse對象提供的方法來設置。我們通過response.setCharactorEncod-ing(“UTF-8”);i置編碼使用UTF-8字符碼表。通過使用
response. setHeader(“Content-Type”,“text/html; charset=UTF-8”);設置瀏覽器使用UTF-8字符表進行解碼,編碼解碼使用的碼表一致了,就不會出現中文亂碼問題。這兩條語句的功能還可以通過一句代碼來實現,即response.setContentTypef“text/html;charset=utf-8”1:
3.3 請求參數的中文亂碼問題
在實際項目開發中,用戶的信息常常經由表單來提交,用戶在填寫表單時,不可避免地要填寫中文信息。當提交這些用戶信息時,瀏覽器會傳遞這些表單信息。而瀏覽器在傳遞請求參數時,采用的編碼是UTF-8,但是在解碼的時候使用的是默認的字符集IS0-8859-1,這樣就導致了亂碼問題的出現。為了避免中文亂碼的出現,可以通過HttpServletRequest接口提供的setCharacterEncoding0方法設置request對象的解碼方式為UTF-8,使解碼的字符集和編碼的字符集一致。
3.4 中文文件下載出現的中文亂碼問題
在web項目開發中,常常需要實現文件的上傳與下載功能,比如圖片的上傳與下載、郵箱中附件的上傳與下載等。在下載文件時,文件的名字如果是中文的,就需要在程序中對中文亂碼進行處理。如果不處理,通過瀏覽器下載文件時,要下載的文件名稱就顯示不出來。Servlet API中定義了一個URLEncoder類。我們通過這個類中定義的encoding0方法,可以將文件路徑中的字符串以指定的編碼進行輸出。經過URL編碼后,HTTP消息頭中的數據轉換成通用的符號,在下載文件時就不會出現亂碼問題了。
4 使用過濾器對全站實現統一編碼,解決中文亂碼問題
在以上所述的解決中文亂碼問題的方法中,大部分都是在Servlet中設置編碼方式,這種方式也是很有效的。但是,在實際web開發中,會出現很多Servlet,每個Servlet中都進行編碼的設置,會重復書寫大量的代碼,給開發工作帶來麻煩。為了解決這個問題,我們可以在過濾器中對獲取到的請求和響應消息進行編碼,將全網站使用的編碼統一,從而解決中文亂碼問題。使用過濾器可以極大地提高控制效果,同時也降低了開發成本,提高了工作效率。使用過濾器處理中文亂碼時,根據請求方式的不同,處理亂碼的方式也不同。
4.1 POST方式
用戶請求時,如果采用的請求方式是POST,那么請求參數會存放在消息體中,可以使用setCharactorEncoding0進行編碼設置,這個方法只對消息體有效。
4.2 GET方式
如果用戶請求使用的方式是GET,這種請求方式,請求參數是存放在消息頭中的,不能直接使用setCharactorEncoding0進行編碼設置。需要通過獲取URI參數進行設置。但是每次遇到GET請求方式時,都需要單獨進行處理,會很麻煩。為此,可以先定義一個HttpServletRequestWrapper類的子類,在子類中對getParameter0方法重寫,從而獲取請求參數,再對請求參數進行編碼設置,從而解決中文亂碼問題。
public String getParameter(String name){
Stringstr= super.getParameter(name);
if (str== nuID
return null;
String method= super.getMethod0;
if(”get”.equals(method》{
try{
str= new String(str.getBytes(”iso-8859-1”),”utf-8”);
) catch (Exception e){
throw new RuntimeException(e);
)
)
Retum str;
)
5 結束語
Java Web技術是在計算機領域發展人員的必備利器之一,在使用Java Web技術開發項目時,開發人員會遇到各種各樣的中文亂碼問題,通過對具體問題的具體分析,找到切實有效的方法去解決,才能保障項目開發能夠順利完成。
參考文獻:
[1]劉長生,謝強,丁秋林.Java應用中的漢字亂碼問題分析[J].計算機技術與發展,2006,16(1):158-161.
[2]王衛,李天琦,湯偉,等.基于JSP技術項目開發中中文亂碼問題研究[Jl.電腦編程技巧與維護,2018(8):38-39,61.
[3]任平紅,陳矗,鄭秋梅.Java中文亂碼問題研究[J].計算機技術與發展,2013,23(3):117-120.
[4]劉冰.Java編程中中文問題的產生及其解決方案[Jl.現代計算機:專業版,2010(3):105-107,116.
[5]賈曉芳,沈澤剛.Java Web應用開發中的常見亂碼形式及解決方法[Jl.軟件導刊,2017,16(4):214-216.
【通聯編輯:代影】