姚竟發(fā),唐小強
保定電力職業(yè)技術學院,河北保定 071000
JSP(Java Server Pages)是由Sun公司倡導、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術標準,jsp技術采用java作為開發(fā)腳本語言,java本身有著很好的跨平臺性,但是jsp在結(jié)合頁面技術后,最使人頭疼的一個問題就是不能很好的處理中文亂碼問題,在開發(fā)過程中帶來諸多不便,本文從剖析中文亂碼產(chǎn)生的各種原因入手,并給出相應的解決方案。
1)中文的編碼很多,在不同的情況下可能有多種不同的二進制值;
2)在某些應用中傳遞數(shù)據(jù)時,可能把中文轉(zhuǎn)換成其它形式;
3)在一個應用系統(tǒng)中,編碼之間存在各種各樣的轉(zhuǎn)換;
4)在轉(zhuǎn)換過程中需要制定編碼方式;
5)在具體實踐過程中,可能忽略或忘記設置編碼;
6)不同的軟件環(huán)境其編碼設置方式不同也容易導致中文亂碼;
7)編碼工具的多樣性以及對編碼的模糊認識不清。
網(wǎng)上常出現(xiàn)的 JSP/Servlet encoding 問題一般都表現(xiàn)在 browser或應用程序端,如:
瀏覽器中看到的 Jsp/Servlet 頁面中的漢字怎么都成了‘?’;瀏覽器中看到的 Servlet 頁面中的漢字怎么都成了亂碼;JAVA 應用程序界面中的漢字怎么都成了方塊;Jsp/Servlet 頁面無法顯示GBK 漢字;Jsp/Servlet 不能接收 form 提交的漢字;JSP/Servlet 數(shù)據(jù)庫讀寫無法獲得正確的內(nèi)容。
1)在jsp中如果指定了<%@ page contentType="text/html;charset=A" %>,那么在該jsp中所有用到的數(shù)據(jù),如果沒有指定編碼,那么這些數(shù)據(jù)的編碼方式為A。
從request得到的數(shù)據(jù)如果沒有指定request的編碼的話,默認編碼為iso-8859-1。
假設從別的地方得到的數(shù)據(jù)是使用原來初始的編碼的,比如從數(shù)據(jù)庫得到數(shù)據(jù),如果數(shù)據(jù)庫的編碼是B,那么該數(shù)據(jù)的編碼是B而不是A,也不是系統(tǒng)默認的,此時,如果要輸出的數(shù)據(jù)的編碼不是A,那么,很可能顯示亂碼,所以首先要將數(shù)據(jù)正確轉(zhuǎn)化為編碼A,然后再輸出;
2)在jsp中如果沒有指定<%@ page contentType="text/html;charset=A" %>,那么默認的A編碼為iso-8859-1;
3)Servlet中 如 果 執(zhí) 行 了 像 response.setContentType("text/html;charset=A"),說明將response的字符輸出流編碼設置為A,所有要輸出的數(shù)據(jù)的編碼要轉(zhuǎn)化為A,否則就會出現(xiàn)亂碼。Servlet中從request得到的數(shù)據(jù)的編碼和jsp中一樣的,但是在servlet java文件中構造的數(shù)據(jù)是使用是系統(tǒng)默認的編碼(iso-8859-1);servlet中從外部得到的數(shù)據(jù)使用的是原來的編碼,比如從編碼為B的數(shù)據(jù)庫得到的數(shù)據(jù)是編碼為B,不是A,也不是系統(tǒng)默認的編碼。
<%@ page contentType="text/html; charset=gb2312"%>,就可以消除亂碼了。
方法1:在使用request獲取參數(shù)前,加上此語句:request.setCharacterEncoding("A"), 此處設置的編碼要和傳遞參數(shù)的頁面采用的編碼方式一致。
方法2:使用過濾器(filter),在doFilter方法中做如下處理:
}同時,在web.xml中配置該過濾器:
servlet可以處理中文后,jsp頁面接收Form/Request傳遞的參數(shù)卻仍然顯示為亂碼。
如果你的表單內(nèi)容為