tomcat編碼亂碼問題

最近又碰到了中文亂碼問題,這裏我沒有把數據庫牽扯進來,先說下我的環境,servlet容器使用Tomcat6.0,瀏覽器FireFox3.0、IE6,涉及字符編碼設置的地方我的思路就是編碼的地方都統一使用UTF

-8,具體配置如下:

1.所有頁面的charset設置爲UTF-8。

2.Tomcat的URIEncoding默認是ISO-8859-1,而我設置爲UTF-8,主要是想解決中文命名的文件以及請求以get方式提交有可能出現的亂碼問題(但是瀏覽器在地址欄中的中文編碼默認是gbk不是頁面的

charset)。

3.添加過濾器,調用request.setCharacterEncoding("utf-8")方法將request的字符集設定爲utf-8,解決請求以post方式提交的亂碼問題。

其實這樣的設置貌似是不會再出現亂碼問題了,不過,問題依舊來了!

我把用戶發送請求方式不同引起的中文問題劃分了四種類型:

1、表單的get提交

2、表單的post提交

3、頁面鏈接傳遞中文參數

4、地址欄中參數直接輸入中文提交
1.首先我們看錶單get方式提交

      瀏覽器根據頁面的charset編碼方式對頁面進行編碼,然後提交至服務器,首先進入對應的字符編碼過濾器(如果有的話),不過Tomcat6.0對於get提交方式採用的是server.xml文件中的

URIEncoding編碼方式,而並不會採用過濾器中設置的編碼,那麼根據我的環境設置,jsp頁面都使用UTF-8的編碼,Servlet容器的URIEncoding也設置爲UTF-8,則servlet不用進行轉碼即可正確解碼,獲

得正常的中文字符串。那麼,響應頁面的中文因爲頁面的統一編碼(UTF-8)自然也會正常顯示。當然,如果我們Tomcat的URIEncoding設置爲其他非UTF-8的編碼方式時,頁面的內容進入Tomcat解析時,因

爲Tomcat和頁面的編碼不統一,就需要轉碼。
2.表單的post提交

對於這種方式的請求,request.setCharacterEncoding("一般來自於web.xml中過濾器設置的參數")方法進行編碼設置將會產生作用,struts的表單提交方式默認爲post方式,那麼按照上面我的環境設置

,頁面,容器,都採用UTF-8編碼方式,就不會產生中文亂碼問題。

3.頁面鏈接中傳遞中文參數

我虛擬一個這樣的場景,請求頁面中有如下代碼

<%  
String username = "編輯";  
%> 
<a href="hello.do?username=<%=username%>">頁面中鏈接傳遞中文</a> 
對於這種方式,我們需要先將參數使用統一的編碼方式編碼,將編碼後的字符放入鏈接,這裏我對參數以UTF-8方式編碼,如下

<%  
String username = java.net.URLEncoder.encode("編輯","UTF-8");  
%>
那麼這樣我們也不會產生中文亂碼問題

4.地址欄中參數直接輸入中文提交

例如瀏覽器地址欄中輸入"http://localhost:8080/helloapp.do?username=編輯"提交,對於這種方式,瀏覽器不會採用頁面的charset方式對URL中的中文進行編碼後提交至服務器(IE,FireFox都一樣),

而是採用系統的GBK轉碼爲ISO-8859-1之後提交至Servlet容器,那麼,如果對於前三種方式我們所做的設置,在這裏就有問題了,因爲進入容器時中文進行了GBK至ISO-8859-1的轉碼,而之前我們的

Servlet容器URIEncoding設置爲UTF-8,當我們使用request.getParameter("username")時,相當於又進行了這樣的流程GBK-->ISO-8859-1-->UTF-8


綜上,對於亂碼問題,前三種方式是一般用戶的請求方式,第四種屬於非正常途徑的請求方式,對於這種方式產生的問題我認爲無法很好的解決,也不需要解決。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章