摘要:中文亂碼是Java編程中的一類常見(jiàn)問(wèn)題,其主要是由于數(shù)據(jù)輸入輸出時(shí)的編解碼字符集不統(tǒng)一造成的。本文首先對(duì)該問(wèn)題出現(xiàn)的原因進(jìn)行了分析,然后分別就幾處最為常見(jiàn)的亂碼位置及其處理方式進(jìn)行了詳細(xì)分析。
關(guān)鍵詞:中文亂碼;Java編程;字符集
中圖分類號(hào):TP31 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-7712 (2013) 14-0000-01
Java語(yǔ)言具有靈活性高、可跨平臺(tái)等特點(diǎn),是當(dāng)前所使用的一種主流的編程語(yǔ)言。但是在使用Java編程過(guò)程中程序員經(jīng)常面臨的一個(gè)問(wèn)題就是中文漢字的顯示問(wèn)題,如何對(duì)帶有中文字符的JSP文件、使用JSP技術(shù)開(kāi)發(fā)的web網(wǎng)頁(yè)以及與java程序通信的數(shù)據(jù)庫(kù)進(jìn)行編程處理,以避免其中出現(xiàn)中文亂碼是java編程中需要重點(diǎn)注意的一類問(wèn)題。
一、中文亂碼在Java程序中出現(xiàn)的原因
Java程序規(guī)定的編碼字符集為Unicode字符集,但是我國(guó)很多本地系統(tǒng)或應(yīng)用所使用的編碼字符集則為GBK字符集,這就使得使用兩種不同字符集的應(yīng)用在進(jìn)行數(shù)據(jù)傳輸或交換時(shí)首先需要將傳輸或交換的信息轉(zhuǎn)換為本地可識(shí)別的字符集才可以進(jìn)入下一步處理。而由Java編程實(shí)現(xiàn)的應(yīng)用涉及多個(gè)領(lǐng)域,如瀏覽器、應(yīng)用、服務(wù)器、數(shù)據(jù)庫(kù)等,一旦其中某一部分所使用的字符集與其他部門出現(xiàn)不兼容或轉(zhuǎn)換錯(cuò)誤,就容易因輸入輸出編碼格式的不一致而出現(xiàn)亂碼問(wèn)題。
二、常見(jiàn)的Java中文亂碼位置及其解決方案
綜合來(lái)看,Java中文亂碼出現(xiàn)主要集中在以下幾個(gè)位置:(1)基于JSP的中文web頁(yè)面;(2)包含中文字符的提交數(shù)據(jù);(3)Java程序與數(shù)據(jù)庫(kù)之間的通信數(shù)據(jù)。
(一)基于JSP的中文web頁(yè)面亂碼分析
用戶在訪問(wèn)由JSP所生成的頁(yè)面時(shí)有可能出現(xiàn)中文亂碼,導(dǎo)致該亂碼出現(xiàn)的原因主要有兩種,一種原因是由JSP在后臺(tái)生成動(dòng)態(tài)頁(yè)面時(shí),其所生成的信息本身就是亂碼,另一種原因則是瀏覽器對(duì)編譯JSP文件時(shí)顯示不正確所導(dǎo)致的亂碼。
為提高解決效率,解決該問(wèn)題時(shí)可以先使用代碼查看工具對(duì)網(wǎng)頁(yè)的源文件進(jìn)行查看,確認(rèn)源文件中的中文信息是否能夠正確顯示,若源文件中的中文顯示正常則說(shuō)明該問(wèn)題是由瀏覽器解碼網(wǎng)頁(yè)錯(cuò)誤所導(dǎo)致的,若源文件中中文顯示不正常則說(shuō)明該問(wèn)題是由JSP后臺(tái)生成網(wǎng)頁(yè)時(shí)處理錯(cuò)誤所導(dǎo)致的。
對(duì)于解碼錯(cuò)誤導(dǎo)致的中文亂碼可以通過(guò)設(shè)置JSP中的contentType屬性為可支持中文的國(guó)標(biāo)字符集即可,即
<%@ page contentType=”text/html;charset=GB2312”>
對(duì)于后臺(tái)網(wǎng)頁(yè)處理錯(cuò)誤所導(dǎo)致的中文亂碼可以在輸出頁(yè)面前向其中添加支持中文顯示的字符集,即
;
response.setContentType(“text/html;charset=GB2312”)
(二)包含中文字符的提交數(shù)據(jù)亂碼分析
中文字符填寫和提交是web網(wǎng)頁(yè)表單填寫的基本功能之一。但是在提交過(guò)程中有可能出現(xiàn)用戶輸入和顯示的中文文本正確,而后臺(tái)傳輸錯(cuò)誤的現(xiàn)象發(fā)生。解決該問(wèn)題可以從以下三方面著手。
首先,使用Post的方式進(jìn)行數(shù)據(jù)提交時(shí)要注意對(duì)tpye參數(shù)的值進(jìn)行確認(rèn)或修正。該提交方式會(huì)在提交前對(duì)JSP中的contentType屬性進(jìn)行查詢,然后根據(jù)該屬性中定義的編解碼方式對(duì)提交數(shù)據(jù)進(jìn)行編碼,經(jīng)由HTTP轉(zhuǎn)發(fā)和傳輸后提交給后臺(tái)的服務(wù)器端,服務(wù)器端在存儲(chǔ)前同樣會(huì)對(duì)contentType屬性中的字符集關(guān)鍵字查詢后再進(jìn)行解碼。
其次,使用Get的方式進(jìn)行數(shù)據(jù)提交時(shí)要注意對(duì)服務(wù)器相關(guān)屬性進(jìn)行確認(rèn)或修正。目前是使用的Tomcat配置文件默認(rèn)的字符集為ISO-8859-1,該字符集是無(wú)法處理中文字符的,為保證Get方式下的表單提交正確,需要手動(dòng)修改Tomcat中的server.xml文件,使服務(wù)器能夠支持中文編解碼。需要注意的是,該修改需要重啟服務(wù)器后才能生效。
再次,由request中相關(guān)數(shù)據(jù)的解碼方式不當(dāng)所引起的亂碼需要對(duì)request中的濾波器相關(guān)函數(shù)進(jìn)行重新設(shè)置,以便于發(fā)現(xiàn)問(wèn)題時(shí)能夠根據(jù)過(guò)濾規(guī)則對(duì)相關(guān)的數(shù)據(jù)信息進(jìn)行檢查或修改。具體的,濾波器的過(guò)濾規(guī)則設(shè)置代碼如下:
Public void doFilter(ServletRequest request, ServletResponse respone, FilterChain chain)
Throws IOException, ServletException
{
If(!ignore||(request.getCharacterEncoding()==1)) //該語(yǔ)句用于查看濾波器中的編碼是否能夠編譯中文字符,若不能夠編譯,需要對(duì)其進(jìn)行設(shè)置
{ String encoding=selectEncoding(request);
If (encoding!=1)
request.setCharcterEncoding(encoding);}//查詢字符集關(guān)鍵字類型,并根據(jù)查詢結(jié)果進(jìn)行配置
chain.doFilter(request,response); }
(三) Java程序與數(shù)據(jù)庫(kù)之間的通信數(shù)據(jù)亂碼分析
該亂碼問(wèn)題主要集中在使用JDBC驅(qū)動(dòng)的數(shù)據(jù)庫(kù)與Java程序之間。JDBC默認(rèn)的編碼格式同樣為ISO標(biāo)準(zhǔn),該標(biāo)準(zhǔn)是無(wú)法識(shí)別中文字符的。在數(shù)據(jù)輸入輸出之前沒(méi)有進(jìn)行編碼轉(zhuǎn)換,就會(huì)導(dǎo)致亂碼現(xiàn)象發(fā)生。其解決方式同上述亂碼問(wèn)題解決方式,需要對(duì)數(shù)據(jù)庫(kù)中與編碼格式有關(guān)的.ini文件進(jìn)行編碼修改。
三、總結(jié)
Java是當(dāng)前跨平臺(tái)應(yīng)用所使用的主要編程語(yǔ)言之一,其應(yīng)用過(guò)程中出現(xiàn)中文亂碼的根本原因在于字符編碼格式不匹配。為避免該情況的出現(xiàn),一方面要盡快制定和使用統(tǒng)一、規(guī)范的Java開(kāi)發(fā)標(biāo)準(zhǔn),另一方面要在Java編程時(shí)在出現(xiàn)數(shù)據(jù)傳輸?shù)牡胤阶龊米址幋a轉(zhuǎn)換相關(guān)工作。
參考文獻(xiàn):
[1]任平紅,陳矗,鄭秋梅.Java中文亂碼問(wèn)題研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013,23(3).
[2]王子君,范學(xué)峰,張志浩.Java 編碼問(wèn)題研究與應(yīng)用[J].計(jì)算機(jī)工程,2002,28(3).
[3]曹莉,趙文靜.Java中文處理研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(5)
[4]彭利民,孫素云.JSP和Servlet網(wǎng)絡(luò)編程設(shè)計(jì)中漢字編碼的研究[J].計(jì)算機(jī)與現(xiàn)代化,2006(3).