網站程序中的Form表單是重要的組成內容之一很多時候Form表單會出現亂碼的現象會給網站造成一定的困擾如何解決亂碼的問題?
JSP和Servlet的六種中文亂碼處理方法
一表單提交時出現亂碼
在進行表單提交的時候經常提交一些中文自然就避免不了出現中文亂碼的情況對於表單來說有兩種提交方式get和post提交方式所以請求的時候便有get請求和post請求每種方式都有著不同的解決方法之所以出現亂碼原因就在於get請求時其傳遞給服務器的數據是附加在URL地址之後的;而post的請求時其傳遞給服務器的數據是作為請求體的一部分傳遞給服務器這也就導致了對它們所產生的亂碼的處理方式是不同的
客戶端的get請求
對於不同的請求方式解決亂碼的問題也是不一樣的對於客戶端的get請求來說服務器端處理要想不出現亂碼解決這個問題稍微復雜一些需要用到String類型的構造函數其中的一個構造函數就是用指定的編碼方式去解碼一般都用“UTF”的方式只要在服務器端將請求得到的參數重新構造成一個字符串就行了
經過構造之後客戶端輸入中文且表單時get請求的情況下str就變成了中文了
客戶端的post請求
對於客戶端的post請求來說處理亂碼的問題就比較簡單了因為請求的數據時作為請求體的一部分傳遞給服務器的所以只要修改請求內的編碼就行了只要在服務器端的最開始處將請求的數據設置為“UTF”就行了輸入如下語句request setCharacterEncoding(“UTF”);這樣用戶在服務器端獲取到的中文數據就不再是亂碼了
二超鏈接時出現亂碼(低版本浏覽器不行IE)
在Web開發中挺多的時候都是通過超鏈接去傳遞中文參數的這也會導致在顯示的時候也會出現亂碼對於超鏈接來說它實際上是向服務器端發送了一個請求而它發出的請求是屬於get請求所以對於超鏈接的亂碼來說它處理亂碼的方式和表單的get請求出現亂碼的方式是一樣的
三重定向時出現亂碼(低版本浏覽器不行IE)
有時寫上response的sendRedirect方法進行重定向時也會出現亂碼重定向時實際上也是向服務器發送了一個請求所以解決亂碼的方法和和上面是一樣的
四浏覽器版本低導致的亂碼
上網的時候有時提交的一些信息在地址欄顯示的是“%C%C%CC%C”的字樣其實這都是防止出現亂碼進行的解決方案如果你的浏覽器是IE或以下版本則我們的第二種情況和第三種情況會出現亂碼(尤其是當中文是奇數的時候)這就不好使了所以我們必須采用另一種比較實際的作法
在javanet包中提供了URLEncoder類和URLDcoder類這兩個類又分別提供了encode和decode兩個靜態方法分別用於進行編碼和解碼我們將要傳遞的中文參數進行編碼之後在傳遞給服務器服務器解碼之後就可以顯示中文了
進行編碼URLEncoderencode(stuname”UTF”)
傳遞給服務器<a href=”/jsp?stuname<%=stuname%>”>傳遞</a>
進行解碼URLDecoderdecode(stuname”UTF”)
五返回浏覽器顯示的亂碼
在Servlet編程中經常需要通過response對象將一些信息返回給浏覽器給我們的客戶端而我們在服務器端顯示的中文但是響應給客戶端浏覽器卻是亂碼這主要是由於response對象的getWriter()方法返回的PrintWriter對象默認使用“ISO”字符集編碼進行Unicode字符串到字節數組的轉換由於ISO字符集中根本就沒有包含中文字符所以Java在進行轉換的時候會將無效的字符編碼輸出給客戶端於是便出現了亂碼為此ServletResponse接口中便定義了setCharacterEncodingsetContentType等方法來指定getWriter方法返回的PrintWriter對象所使用的字符集編碼所以我們在寫Servlet程序中在調用getWriter方法之前設置這些方法的值
只要編寫Servlet文件中含有響應給客戶端的信息那麼就要寫上這兩句話最好寫上第二句話因為它的優先級高它的設置結果將覆蓋setContentType等方法設置的字符編碼集
六修改Tomcat的編碼
在get請求所導致亂碼問題中還有一種解決的方案我們常用Tomcat作為運行Servlet和JSP的容器而Tomcat內部默認的編碼是ISO所以對於get請求方式其傳遞的數據(URI)會附加在訪問的資源後面其編碼是Tomcat默認的如果修改該URI的編碼那麼對於所有的get請求方式便不會出現亂碼了包括上邊說的重定向和超鏈接在Tomcat的配置文件serverxml中找到修改Tomcat的端口的地方在其內部加入URIEncoding屬性設置為和你的項目中所設的編碼一樣的值這裡全部都是UTF
在編寫Servlet和JSP的時候為了避免出現亂碼最重要的就是采用一致的編碼如果編碼都一致了肯定不會出現亂碼
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20540.html