資源描述:
《jsp中文編碼亂碼的分析與解決》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、jsp中文編碼亂碼的分析與解決jsp技術(shù)目前普遍應(yīng)用于網(wǎng)絡(luò)編程,java在中文處理方面經(jīng)常出現(xiàn)亂碼現(xiàn)象。本文從分析各種常見的jsp頁面中文亂碼產(chǎn)生的原因入手,并給出該亂碼的解決方案。經(jīng)過多次實踐,基本可以解決常見jsp頁面常見的中文亂碼問題,有著很好的廣泛性。匕的信息,關(guān)鍵詞網(wǎng)絡(luò)編程;中文亂碼;jsp頁面編碼TP39A1674-6708(2011)57-0183-020引言JSP(JavaServerPages)是由Sun公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn),jsp技術(shù)采用java作為開發(fā)腳本語言,java本身有著很好的跨平臺性,但是jsp在結(jié)合頁面技
2、術(shù)后,最使人頭疼的一個問題就是不能很好的處理中文亂碼問題,在開發(fā)過程中帶來諸多不便,本文從剖析中文亂碼產(chǎn)生的各種原因入手,并給出相應(yīng)的解決方案。1中文亂碼的根源1)中文的編碼很多,在不同的情況下可能有多種不同的二進(jìn)制值;2)在某些應(yīng)用中傳遞數(shù)據(jù)時,可能把中文轉(zhuǎn)換成其它形式;3)在一個應(yīng)用系統(tǒng)中,編碼之間存在各種各樣的轉(zhuǎn)換;4)在轉(zhuǎn)換過程中需要制定編碼方式;5)在具體實踐過程中,可能忽略或忘記設(shè)置編碼;6)不同的軟件環(huán)境其編碼設(shè)置方式不同也容易導(dǎo)致中文亂碼;7)編碼工具的多樣性以及對編碼的模糊認(rèn)識不清。2常見的jsp頁面中文亂碼網(wǎng)上常出現(xiàn)的JSP/Servletenco
3、ding問題一般都表現(xiàn)在browser或應(yīng)用程序端,如:瀏覽器中看到的Jsp/Servlet頁面中的漢字怎么都成了‘?瀏覽器中看到的Servlet頁面中的漢字怎么都成了亂碼;JAVA應(yīng)用程序界面中的漢字怎么都成了方塊;Jsp/Servlet頁面無法顯示GBK漢字;Jsp/Servlet不能接收form提交的漢字;JSP/Servlet數(shù)據(jù)庫讀寫無法獲得正確的內(nèi)容。3中文亂碼產(chǎn)生原因分析1)在jsp中如果指定了〈%@pagecontentType=’’text/l;charset=A"%〉,那么在該jsp中所有用到的數(shù)據(jù),如果?]有指定編碼,那么這些數(shù)據(jù)的編碼方式為A。
4、從request得到的數(shù)據(jù)如果沒存指定request的編碼的話,默認(rèn)編碼為iso_8859-1。假設(shè)從別的地方得到的數(shù)據(jù)是使用原來初始的編碼的,比如從數(shù)據(jù)庫得到數(shù)據(jù),如果數(shù)據(jù)庫的編碼是B,那么該數(shù)據(jù)的編碼是B而不是A,也不是系統(tǒng)默認(rèn)的,此時,如果要輸出的數(shù)據(jù)的編碼不是A,那么,很可能顯示亂碼,所以首先要將數(shù)據(jù)正確轉(zhuǎn)化為編碼A,然后再輸出;2)在jsp中如果沒有指定〈%@pagecontentType=〃text/l;charset=A〃%〉,那么默認(rèn)的A編碼為iso-8859-1;Servlet中如果執(zhí)行了像response.setContentType(〃text/
5、l;charset=A〃),說明將response的字符輸出流編碼設(shè)置為A,所有要輸出的數(shù)據(jù)的編碼要轉(zhuǎn)化為A,否?t就會出現(xiàn)亂碼。Servlet中從request得到的數(shù)據(jù)的編碼和jsp中一樣的,但是在servletjava文件中構(gòu)造的數(shù)據(jù)是使用是系統(tǒng)默認(rèn)的編碼(iso-8859-1);servlet中從外部得到的數(shù)據(jù)使用的是原來的編碼,比如從編碼為B的數(shù)據(jù)庫得到的數(shù)據(jù)是編碼為B,不是A,也不是系統(tǒng)默認(rèn)的編碼。4中文亂碼解決方案4.1JSP頁面顯示為亂碼如果只在頁面中加入,該處指定的編碼僅為瀏覽器對字符的顯示處理,但是服務(wù)器的編碼方式和瀏覽器的編碼方式對字符的單獨處理
6、,所以還要在頁面的第一行加上:<%@pagecontentType=z,text/htcharset=gb2312"%〉,就可以消除亂碼了。4.2Servlet接收Form/Request傳遞的參數(shù)時顯示為亂碼方法1:在使用request獲取參數(shù)前,加上此語句:request.setCharacterEncoding(〃A〃),此處設(shè)置的編碼要和傳遞參數(shù)的頁面采用的編碼方式一致。方法2:使用過濾器(filter),在doFilter方法中做如下處理:packagecom.knorray.filters:publicclassCharEncodingFilterimpl
7、ementsFilter{protectedStringencoding=null:publicvoidinit(FilterConfigfilterConfig)throwsServletException{this.encoding=filterConfig.getlnitParameter("encoding");}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain){if(request.getCharacterEncoding()