賈曉芳+沈澤剛


摘要:在運用Java Web 技術開發Web應用程序時,要根據計算機存儲以及傳輸的字符編碼的標準進行編程,字符編碼不統一會導致多種情況的亂碼問題。從亂碼問題產生的根本原因著手分析,從字符編碼以及轉換關系對影響字符編碼的因素進行系統分析,并給出可行的解決方案。
關鍵詞:Java Web技術;字符編碼;中文亂碼
中圖分類號:TP301
文獻標識碼:A
文章編號:16727800(2017)004021403
0引言
Java語言在應用軟件開發方面逐漸取代其它編程語言成為網絡編程首選語言。Java技術提供跨平臺性,支持網絡與數據庫技術,已廣泛應用于移動互聯網、網絡開發平臺等領域。在Java Web應用開發過程中,伴隨著各種亂碼問題的出現,這給程序員的軟件開發工作帶來很多麻煩,解決亂碼問題是Java Web應用程序開發過程中需解決的首要問題。本文將對開發過程中常出現的幾種亂碼問題的原因及影響因素進行分析,并給出具體可行的解決方案。
1Java Web應用中的常用編碼
在Java Web應用開發中,字符編碼轉化是必要過程,常用到UTF-8、Unicode、GB2312/GBK、ISO-8859-1這幾類。UTF-8是廣泛應用于程序開發中的雙字節編碼,在Unicode字符集中以一種多字節編碼的形式存在,能與Unicode編碼進行可逆字符轉換同時兼容ISO-8859-1編碼。該編碼本身帶有校驗功能,在網頁上多會出現關于中文簡體或者其它語言的提醒。Unicode編碼是統一字符編碼的標準集,是唯一的二進制計算機字符編碼,能表示所有語言的字符,不受語言與運行平臺的限制,可以進行跨語言、跨平臺的文本轉換操作,使用0~65 535的雙字節無符號對每一個字符進行編碼,確保每個字符的表示方式唯一。 GB2312/GBK編碼屬于國標碼,用來表示中文的雙字節字符編碼,其中GBK編碼表示簡體字和繁體字,完全兼容GB2312編碼,屬于GB2312編碼的擴充編碼,GB2312編碼可以兼容ASCII碼,但僅能表示中文簡體字。ISO-8859-1編碼屬于單字節編碼,向下兼容ASCII碼,應用于英文系統,字符范圍只有0~255,無法表示中文字符,在很多協議上作為默認編碼,在Java網絡傳輸中作為標準字符集應用。 在英文字符的網頁上只能使用ISO-8859-1編碼,在只出現中文的網頁上,只能選擇中文系列的字符編碼。尤其是UTF-8編碼,UTF系列中文字符編碼在實際中比較常用,使用這種編碼會降低亂碼出現機率。
2Java Web的編碼及轉換機制
2.1Unicode與常用編碼之間的直接轉換
Unicode與GB2312/GBK、UTF-8都是中文字符編碼。轉換時有轉換規則,都是通過字節轉換為字符串,區別是每個漢字轉換成的字節數不同。圖1所示是在中文系統中常用編碼之間的轉換關系,需要Unicode編碼輔助完成編碼轉換,了解中文系統常用編碼轉化規則就可以避免亂碼問題。
2.2編碼轉換機制
為了使Java語言開發的Web應用程序可以在各種平臺下無限制運行,Java內部規定統一使用Unicode字符編碼來表示字符集,Java源程序根據操作系統默認的編碼方式完成轉碼,最終轉化成UTF-8編碼形式寫入.class文件中。例如操作系統默認GBK編碼,編譯時要將GBK編碼先與Unicode編碼進行轉換,然后轉換成UTF-8格式寫入.class文件中。按照這樣的轉換方式就不容易在中文系統中出現亂碼。若在英文系統中采用ISO-8859-1編碼轉化就不會出現亂碼現象。如圖2將簡單描述Java源程序編碼的轉換流程。
3Java Web應用開發中常見亂碼形式及成因
當Java Web技術應用在JSP動態網站開發過程中,最容易出現亂碼現象,比如Jsp頁面顯示亂碼、用戶提交數據出現亂碼現象、數據庫出現亂碼現象等。
3.1JSP頁面訪問出現亂碼問題
基于Java Web技術開發應用程序,訪問JSP頁面或Servlet 產生的頁面時,在本該出現中文字符的地方出現亂碼,可能存在兩個原因:一是瀏覽器的顯示問題;二是后臺代碼執行出來的程序內容就是亂碼。瀏覽器有問題,需要著重設置JSP或者Servlet屬性。開發工具的字符編碼出現問題是由于使用的Eclipse、Tomcat編程軟件默認輸出的字符是適用于英文系統的ISO-8859-1編碼,若編譯時沒有更改,就容易產生亂碼。
運行環境影響正常的編譯操作,操作系統版本不同,操作系統默認編碼與所安裝的系統版本不一致,若將編譯好的.class文件植入一些不支持運行的操作系統就會編碼沖突,產生亂碼。針對該種情況,開發人員多會在不同版本的操作系統上,用記事本工具創建網頁源碼文件來避免亂碼,也可以用指令指明字符編碼的方式來避免瀏覽器本身的字符編碼與代碼中的字符編碼不一致所導致的中文亂碼現象。
3.2用戶提交表單數據亂碼問題
用戶提交表單數據時出現亂碼,原因是在Request對象獲取用戶提交數據的中文信息后,由于Request對象對瀏覽器提交的中文解碼不正確,導致輸出出現亂碼。可以在接收用戶提交的表單信息的JSP文件或者Servlet文件中正確設置response.setCharacterEncoding參數,同時將客戶端請求編碼設置轉換成瀏覽器編碼。在響應頁面上,提倡正確使用response.setCharacterEncoding(“UTF-8”),正確設置編碼方式以避免亂碼現象。
3.3訪問數據庫出現亂碼問題
當應用程序通過JDBC向數據庫寫入或者讀取數據時,傳入數據庫的數據多數以中文編碼形式存在,而Java應用程序與數據庫傳遞數據操作時,是以ISO-8859-1編碼為默認編碼,這時會因編碼沖突導致亂碼。
4Java Web應用開發中亂碼問題解決方案
4.1JSP頁面訪問出現亂碼問題解決方案
JSP頁面訪問出現亂碼問題是應用開發過程中最普遍、復雜性較低的一種亂碼問題,開發人員為了避免這種現象,通常在JSP頁面部首添加:
<% pageEncoding="UTF-8"%>。
有時也會對軟件本身進行設置,一般會將Eclipse中工作空間的字符編碼設置為UTF-8編碼。而Tomcat,要先找到Server.xml配置文件,找到如下代碼,在代碼的末端加入URIEncoding=”UTF-8”,再重新啟動Tomcat服務器,就能解決問題。
4.2用戶提交表單數據亂碼問題解決方案
在Servlet中,只對Request設置參數無法正確判斷解析URL中傳遞來的數據參數,為了進一步判斷和解決該情況的亂碼問題,在用戶提交表單數據出現亂碼問題時,開發人員通常選擇在Servlet中添加:
String str=new String(request.get Parameter(“參數名”).getBytes(“ISO-8859-1”,“UTF-8”);
提交的數據要通過HTTP的實體內容發送給服務器,服務器接收時對Request設置正確的解碼方式,以免出現亂碼現象。
4.3訪問數據庫出現亂碼現象解決方案
訪問數據庫出現亂碼現象也是與字符編碼轉換有關,在解決該問題時,首先要確定JSP/Servlet與數據庫采用的都是統一的中文編碼,然后明確數據庫中的中文數據正常,最后在MySQL中,使用配置向導設置數據庫將UTF-8編碼設置成默認的連接對象。
jdbc:mysql://localhost:3306/db1user=root&password=123456& useUnicode=true&characterEncoding=UTF-8
5過濾器解決亂碼問題
采用過濾器解決實際項目中出現的亂碼問題,對于Java Web開發應用,過濾器主要用于過濾、攔截請求和響應信息。可以在Servlet過濾器或JSP頁面運行之前和之后自動調動,Servlet過濾器能夠對Servlet容器的請求和響應進行檢查和修改。通過在web.xml文件中配置過濾器和編寫實現過濾器功能代碼來處理亂碼問題。
在filter配置中,指定初始化參數字符編碼encoding的值為UTF-8,filter類中讀入該參數的值,并把resquest的字符編碼、response的字符編碼設置為encoding。過濾器處理亂碼的實現編碼如下:
public void doFilter(ServletRequest request,ServletRequest response) throws IOException,ServletException{ String encoding=selectEncoding(request); if(encoding!=null) Request.setCharacterEncoding(encoding); chain.doFilter(request,response); }
6結語
研究結果表明,在Java Web技術開發應用中存在的幾種不同情況的亂碼問題多數與字符編碼有關,在程序編寫過程中字符編碼設置不統一或正確的編碼轉換方式不正確,都會產生亂碼問題。影響字符編碼的因素不僅與字符編碼自身的轉換標準有關,還與軟件開發環境以及開發工具與Java輸出程序的字符編碼設置不一致有關。針對不同情況下發生的亂碼問題,應采取有效的解決辦法。
參考文獻:
[1]賈文瀟,葉慧莉.Java Web開發中的亂碼問題[J].網絡與信息工程,2016(6):6264.
[2]馮忠毅,董海棠,岳建斌,等.Java Web開發中的亂碼問題分析及解決方案研究[J].科技信息,2013(19):92,101.
[3]周兵.Java Web開發中的中文亂碼問題分析及解決方案[J].電腦知識與技術,2014(29):68846888.
[4]張言輝.J2EE平臺下漢字亂碼問題分析及解決[J].電腦知識與技術:學術交流,2010(4X):30193021
[5]楊金花.基于JSP技術中文亂碼的原因及解決方法[J].電子設計工程,2011(1):2528.〖
(責任編輯:孫娟)