一直以來對JSP中出現(xiàn)亂碼的問題都很混亂,現(xiàn)經(jīng)過查閱資料,對JSP亂碼這個問題有比較深刻的認(rèn)識,下邊是我的一些個人總結(jié),希望給同樣迷惑的人帶來幫助。 同時如果不對,希望得到提醒,共同進步。
首先,說說JSP/Servlet中的幾個編碼的作用:
1.< 作用:
* 告訴JSP編譯器在將JSP文件編譯成Servlet時使用的編碼。通常,在JSP內(nèi)部定義的字符串(直接在JSP中定義,而不是從瀏覽器
提交的數(shù)據(jù))出現(xiàn)亂碼時,很多都是由于該參數(shù)設(shè)置錯誤引起的。例如,你的JSP文件是以GBK為編碼保存的
(右擊jsp-->Properties --> Text file encoding設(shè)置成與pageEncoding不一致時,就有亂碼),而在JSP中卻指定
pageEncoding="UTF-8",就會引起JSP內(nèi)部定義的字符串為亂碼
* 當(dāng)JSP中不指定contentType參數(shù),也不使用response.setCharacterEncoding方法時,指定對服務(wù)器響應(yīng)進行重新編碼的編碼
2.< 作用:
* 指定對服務(wù)器響應(yīng)進行重新編碼的編碼,服務(wù)器在將數(shù)據(jù)發(fā)送到瀏覽器前,對數(shù)據(jù)進行重新編碼。
* 瀏覽器也是根據(jù)這個參數(shù)來對其接收到的數(shù)據(jù)進行解碼,對其發(fā)送的請求參數(shù)進行編碼(如果參數(shù)有:
<%=URLEncoder.encode("測試", "GBK") %>或javascript:encodeURI("測試")則以后者為準(zhǔn)),自己可以在IE的菜單中選擇:
查看(V) --> 編碼(D)查看得知瀏覽器的編碼(解碼)和< response.setCharacterEncoding("UTF-8")設(shè)置的編碼是一致的。
因此:只要響應(yīng)結(jié)果不是亂碼,則瀏覽器顯示結(jié)果一定不會是亂碼(服務(wù)器對響應(yīng)編碼和瀏覽器對響應(yīng)解碼的編碼是一樣的)。
出現(xiàn)亂碼的情況是:瀏覽器編碼 ---> 服務(wù)器解碼得到的結(jié)果是亂碼 ---> 造成響應(yīng)有亂碼 --> 瀏覽器顯示亂碼
3.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
作用:
* 控制瀏覽器的以何種編碼顯示網(wǎng)頁的內(nèi)容
* 與2中page指令設(shè)置的區(qū)別是,meta設(shè)置的是瀏覽器解釋,page設(shè)置的是服務(wù)端解釋
4.request.setCharacterEncoding("charset")
作用:
* 設(shè)置對客戶端請求參數(shù)進行解碼所使用的編碼.
* 只對兩種請求參數(shù)提交方式有效:
* POST表單提交
* GET提交(url或GET表單提交), 此時要求配置server.xml的<Connector>標(biāo)簽的屬性: useBodyEncodingForURI="true"
5.request.getParameter("param")和request.getParameterValues("param")所獲取到的參數(shù)數(shù)據(jù)都是經(jīng)過服務(wù)器解碼后的數(shù)據(jù)
接著說下發(fā)送請求到返回響應(yīng)整個編碼解碼過程:
1.瀏覽器對請求編碼 --> 服務(wù)器(容器)對請求解碼 ---> 服務(wù)器對響應(yīng)編碼 ---> 瀏覽器對響應(yīng)解碼
瀏覽器編碼 ---> 容器解碼
瀏覽器編碼默認(rèn)是使用response.setCharacterEncoding—contentType—pageEncoding的優(yōu)先順序指定的編碼的
但當(dāng)對某些參數(shù)使用<%=URLEncoder.encode("測試", "GBK") %>或javascript:encodeURI("測試")來對參數(shù)編碼時,會覆蓋默認(rèn)編碼,
即瀏覽器這些特定的參數(shù)編碼以<%=URLEncoder.encode("測試", "GBK") %>或javascript:encodeURI("測試")為準(zhǔn)
注意:javascript的編碼方式:encodeURI(..)和encodeURIComponent(..)是對其參數(shù)進行UTF-8編碼的
2.瀏覽器最終顯示響應(yīng)結(jié)果出現(xiàn)亂碼是因為在過程:瀏覽器對請求編碼 --> 服務(wù)器(容器)對請求解碼,出現(xiàn)亂碼。
原因是:服務(wù)器對響應(yīng)編碼和瀏覽器對響應(yīng)解碼所使用的編碼都是相同的,為response.setCharacterEncoding—contentType指定的編碼,
而瀏覽器對請求參數(shù)的編碼 和 服務(wù)器對請求參數(shù)解碼 所使用的編碼如果不一致,就會造成亂碼
3.對中文解碼,無論使用什么解碼方式都是中文。中文只有經(jīng)過編碼,再解碼才會出現(xiàn)亂碼的可能,如果起始編碼和末尾解碼所
使用的編碼一致,就不會出現(xiàn)亂碼
聯(lián)系客服