JSP亂碼問題及解決方法
JSP亂碼問題思考及解決方法
一、引起亂碼的原因有:
1、響應中的亂碼:即顯示頁面上的亂碼,如index.jsp顯示出來時,"用戶名"顯示爲亂碼
2、表單提交時的亂碼:即在表單的文本框中輸入爲中文的時候提交到服務出現亂碼
二、針對各原因的解決思路及方法:
1、響應中的JSP亂碼:
說明:
(1).常見的編碼方式:
ISO-8859-1,GB18030,GB2312,UTF-8;
(2)pageEncoding的含義:
pageEncoding表示的是該JSP頁面的編碼,也就是你要保存一個JSP頁面,系統會以這個編碼來保存(我們知道文本文件另存爲的時候會彈出一個提示窗口,你細心一下就會發現原來可以選擇不同的"編碼"來保存),同理,JSP文件默認保存的時候會以你設置的pageEncoding的屬性值保存該JSP頁面。
Eclipse中如果你設置了Window/preferences/jspfiles面版上的Encoding爲某一個值如GB2312,則以後新建一個JSP文件的時候系統會自動加上pageEncoding="GB2312"這一屬性。
注意:pageEncoding="ISO-8859-1"的時候是不能保存中文的,就是說如果你設置爲ISO-8859-1,但又想在JSP文件中寫一段中文,保存文件的時候會提示不能保存。
(3)JSP實現過程:
客戶提交URL請求如:www.WebTest.com/index.jsp
服務器接收到請求
服務器尋找本地文件index.jsp
服務器將index.jsp轉譯爲index.java再編譯爲index_jsp.class文件,並將其作爲響應發給客戶端
客戶端瀏覽器解釋執行得到HTML代碼並顯示給客戶
由上可見,要解決響應中的JSP亂碼問題要注意三點:
I、對本地文件index.jsp的pageEncoding屬性檢查,因爲服務器接到請求後首先是找這個文件。pageEncoding可設爲GB18030,GB2312,UTF-8
II、JSP使用爲響應添加編碼信息,這裏如果charset="ISO-8859-1",顯示出來的中文肯定是亂碼。
III、記得在中加入注意這句話應是在之後的首句話,因爲有可能中使用了中文,如果加在後,則title內容顯示會出現亂碼。這裏的charset值最好與contentType中的charset值一致。
經過上面三步即可解決響應亂碼即顯示出來的頁面中有亂碼的情況。
2、表單提交亂碼:
說明:
(1)表單的文本框中輸入爲中文的時候提交到服務出現亂碼的主要原因是:表單提交即發送請求的過程中使用的編碼是ISO-8859-1.
表單提交方式有POST和GET,所以表單提交亂碼爲POST亂碼和GET亂碼
I、POST亂碼
解決方法是在JSP頁面中加入語句:
II、GET亂碼
POST方式下的解決方式還算簡單,因爲POST方式下提交的數據都是以二進制的方式附加在http請求的body部分發送,只需要在後臺指定編碼格式就足矣解決。
GET方式下會將參數直接附加到url後面,這部分參數無法使用request.setCharacterEncoding()處理,結果就是get形式的所有中文都變成了亂碼。
這裏只能對提交的內容轉換成字節再轉換成另一編碼的字符:如下:
理解起來很簡單:首先我要獲得與現有編碼不同的編碼的字符串,String類中構造函數:newString(byte[],charsetch);
那麼現在我需要一個字節數組,即要對原來的字符串進行轉換,從字符串變成字節數組,String類中的getBytes(charsetch)函數
所以結合起來就是:newString(username.getBytes("iso-8859-1"),"gb2312");