JSP亂碼問(wèn)題及解決方法
JSP亂碼問(wèn)題思考及解決方法
一、引起亂碼的原因有:
1、響應(yīng)中的亂碼:即顯示頁(yè)面上的亂碼,如index.jsp顯示出來(lái)時(shí),"用戶名"顯示為亂碼
2、表單提交時(shí)的亂碼:即在表單的文本框中輸入為中文的時(shí)候提交到服務(wù)出現(xiàn)亂碼
二、針對(duì)各原因的解決思路及方法:
1、響應(yīng)中的JSP亂碼:
說(shuō)明:
(1).常見(jiàn)的編碼方式:
ISO-8859-1,GB18030,GB2312,UTF-8;
(2)pageEncoding的含義:
pageEncoding表示的是該JSP頁(yè)面的編碼,也就是你要保存一個(gè)JSP頁(yè)面,系統(tǒng)會(huì)以這個(gè)編碼來(lái)保存(我們知道文本文件另存為的時(shí)候會(huì)彈出一個(gè)提示窗口,你細(xì)心一下就會(huì)發(fā)現(xiàn)原來(lái)可以選擇不同的"編碼"來(lái)保存),
同理,JSP文件默認(rèn)保存的時(shí)候會(huì)以你設(shè)置的pageEncoding的屬性值保存該JSP頁(yè)面。
Eclipse中如果你設(shè)置了Window\preferences\jspfiles面版上的Encoding為某一個(gè)值如GB2312,則以后新建一個(gè)JSP文件的時(shí)候系統(tǒng)會(huì)自動(dòng)加上pageEncoding="GB2312"這一屬性。
注意:pageEncoding="ISO-8859-1"的時(shí)候是不能保存中文的,就是說(shuō)如果你設(shè)置為ISO-8859-1,但又想在JSP文件中寫一段中文,保存文件的時(shí)候會(huì)提示不能保存。
(3)JSP實(shí)現(xiàn)過(guò)程:
客戶提交URL請(qǐng)求如:www.WebTest.com/index.jsp
服務(wù)器接收到請(qǐng)求
服務(wù)器尋找本地文件index.jsp
服務(wù)器將index.jsp轉(zhuǎn)譯為index.java再編譯為index_jsp.class文件,并將其作為響應(yīng)發(fā)給客戶端
客戶端瀏覽器解釋執(zhí)行得到HTML代碼并顯示給客戶
由上可見(jiàn),要解決響應(yīng)中的JSP亂碼問(wèn)題要注意三點(diǎn):
I、對(duì)本地文件index.jsp的pageEncoding屬性檢查,因?yàn)榉?wù)器接到請(qǐng)求后首先是找這個(gè)文件。pageEncoding可設(shè)為GB18030,GB2312,UTF-8
II、JSP使用<%@pagecontentType="text/html;charset=GB2312"%>為響應(yīng)添加編碼信息,這里如果charset="ISO-8859-1",顯示出來(lái)的中文肯定是亂碼。
III、記得在<head></head>中加入<metahttp-equiv="Content-Type"content="text/html;charset=GB2312">注意這句話應(yīng)是在<head>之后的首句話,因?yàn)橛锌赡?lt;title></title>中使用了中文,如果加在</title>后,則title內(nèi)容顯示會(huì)出現(xiàn)亂碼。這里的charset值最好與contentType中的charset值一致。
經(jīng)過(guò)上面三步即可解決響應(yīng)亂碼即顯示出來(lái)的頁(yè)面中有亂碼的情況。
2、表單提交亂碼:
說(shuō)明:
(1)表單的文本框中輸入為中文的時(shí)候提交到服務(wù)出現(xiàn)亂碼的主要原因是:表單提交即發(fā)送請(qǐng)求的過(guò)程中使用的編碼是ISO-8859-1.
表單提交方式有POST和GET,所以表單提交亂碼為POST亂碼和GET亂碼
I、POST亂碼
解決方法是在JSP頁(yè)面中加入語(yǔ)句:<%request.setCharacterEncoding("UTF-8");%>
II、GET亂碼
POST方式下的解決方式還算簡(jiǎn)單,因?yàn)镻OST方式下提交的數(shù)據(jù)都是以二進(jìn)制的方式附加在http請(qǐng)求的body部分發(fā)送,只需要在后臺(tái)指定編碼格式就足矣解決。
GET方式下會(huì)將參數(shù)直接附加到url后面,這部分參數(shù)無(wú)法使用request.setCharacterEncoding()處理,結(jié)果就是get形式的所有中文都變成了亂碼。
這里只能對(duì)提交的內(nèi)容轉(zhuǎn)換成字節(jié)再轉(zhuǎn)換成另一編碼的字符:如下:
- <%
 - Stringusername=request.getParameter("username");
 - byte[]bytes=username.getBytes("iso-8859-1");
 - Stringresult=newString(bytes,"gb2312");
 - out.print(result);
 - %>
 
理解起來(lái)很簡(jiǎn)單:首先我要獲得與現(xiàn)有編碼不同的編碼的字符串,String類中構(gòu)造函數(shù):newString(byte[],charsetch);
那么現(xiàn)在我需要一個(gè)字節(jié)數(shù)組,即要對(duì)原來(lái)的字符串進(jìn)行轉(zhuǎn)換,從字符串變成字節(jié)數(shù)組,String類中的getBytes(charsetch)函數(shù)
所以結(jié)合起來(lái)就是:newString(username.getBytes("iso-8859-1"),"gb2312");
【編輯推薦】















 
 
 


 
 
 
 