JSP/Servlet幾種編碼作用

來源:互聯網
上載者:User

設定編碼的方式分為:
pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")、response.setCharacterEncoding("UTF-8")


1、pageEncoding="UTF-8"的作用是設定JSP編譯成Servlet時使用的編碼。
   注意:如果JSP檔案是以GBK為編碼儲存的,而在JSP中卻指定pageEncoding="UTF-8",會引起JSP內部定義的字串為亂碼。
2、contentType="text/html;charset=UTF-8"的作用是指定對伺服器響應進行重新編碼的編碼。
3、request.setCharacterEncoding("UTF-8")的作用是設定對用戶端請求進行重新編碼的編碼。
4、response.setCharacterEncoding("UTF-8")的作用是指定對伺服器響應進行重新編碼的編碼。


發送資料:

對於發送資料,伺服器按照response.setCharacterEncoding—contentType—pageEncoding的優先順序,對要發送的資料進行編碼,瀏覽器也是根據這個參數來對其接收到的資料進行重新編碼(或者稱為解碼)。

       
接收資料:

一種是瀏覽器直接用URL提交的資料,另外兩種是用表單的GET和POST方式提交的資料。
無論使用那種方式提交,如果參數中包含中文,瀏覽器都會使用當前瀏覽器編碼對其進行URL編碼。

對於表單中POST方式提交的資料:
在接收資料的JSP中正確request.setCharacterEncoding參數,指定編碼。如果不指定,則預設使用ISO-8859-1編碼,需要進一步處理。
值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。而且,該指定只對POST方法有效,對GET方法無效。

對於URL提交的資料和表單中GET方式提交的資料:
在接收資料的JSP中設定request.setCharacterEncoding參數是不行的,因為預設情況下使用ISO-8859-1對URL提交的資料和表單中GET方式提交的資料進行重新編碼(解碼),而不使用該參數對URL提交的資料和表單中GET方式提交的資料進行重新編碼(解碼)。
解決方案有兩種。一種是在配置中介軟體相應的參數。另一種是對其中出現的字元,預先編碼,在javascript中對encodeURI(string),其採用的是瀏覽器編碼,jsp可以自動識別。


總結:
1、 對於同一個應用,最好統一編碼,推薦為UTF-8,當然GBK也可以。
2、 正確設定JSP的pageEncoding參數
3、 在所有的JSP/Servlet中設定contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),從而間接實現對瀏覽器編碼的設定。
4、 對於請求,可以使用過濾器或者在每個JSP/Servlet中設定request.setCharacterEncoding("UTF-8")。同時,要修改Tomcat的預設配置,推薦將useBodyEncodingForURI參數設定為true,也可以將URIEncoding參數設定為UTF-8(有可能影響其他應用,所以不推薦)。

 

附:
Tomcat 相關設定:
在Tomcat的設定檔的Connector標籤中設定useBodyEncodingForURI或者URIEncoding屬性。
其中useBodyEncodingForURI參數表示是否用request.setCharacterEncoding參數對URL提交的資料和表單中GET方式提交的資料進行重新編碼,在預設情況下,該參數為false(Tomcat4.0中該參數預設為true);
URIEncoding參數指定對所有GET方式請求(包括URL提交的資料和表單中GET方式提交的資料)進行統一的重新編碼(解碼)的編碼。
URIEncoding和useBodyEncodingForURI區別是,URIEncoding是對所有GET方式的請求的資料進行統一的重新編碼(解碼),而useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding參數對資料進行的重新編碼(解碼),不同的頁面可以有不同的重新編碼(解碼)的編碼。
所以對於URL提交的資料和表單中GET方式提交的資料,可以修改URIEncoding參數為瀏覽器編碼或者修改useBodyEncodingForURI為true,並且在獲得資料的JSP頁面中request.setCharacterEncoding參數設定成瀏覽器編碼。

設定編碼的方式分為:
pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")、response.setCharacterEncoding("UTF-8")


1、pageEncoding="UTF-8"的作用是設定JSP編譯成Servlet時使用的編碼。
   注意:如果JSP檔案是以GBK為編碼儲存的,而在JSP中卻指定pageEncoding="UTF-8",會引起JSP內部定義的字串為亂碼。
2、contentType="text/html;charset=UTF-8"的作用是指定對伺服器響應進行重新編碼的編碼。
3、request.setCharacterEncoding("UTF-8")的作用是設定對用戶端請求進行重新編碼的編碼。
4、response.setCharacterEncoding("UTF-8")的作用是指定對伺服器響應進行重新編碼的編碼。


發送資料:

對於發送資料,伺服器按照response.setCharacterEncoding—contentType—pageEncoding的優先順序,對要發送的資料進行編碼,瀏覽器也是根據這個參數來對其接收到的資料進行重新編碼(或者稱為解碼)。

       
接收資料:

一種是瀏覽器直接用URL提交的資料,另外兩種是用表單的GET和POST方式提交的資料。
無論使用那種方式提交,如果參數中包含中文,瀏覽器都會使用當前瀏覽器編碼對其進行URL編碼。

對於表單中POST方式提交的資料:
在接收資料的JSP中正確request.setCharacterEncoding參數,指定編碼。如果不指定,則預設使用ISO-8859-1編碼,需要進一步處理。
值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。而且,該指定只對POST方法有效,對GET方法無效。

對於URL提交的資料和表單中GET方式提交的資料:
在接收資料的JSP中設定request.setCharacterEncoding參數是不行的,因為預設情況下使用ISO-8859-1對URL提交的資料和表單中GET方式提交的資料進行重新編碼(解碼),而不使用該參數對URL提交的資料和表單中GET方式提交的資料進行重新編碼(解碼)。
解決方案有兩種。一種是在配置中介軟體相應的參數。另一種是對其中出現的字元,預先編碼,在javascript中對encodeURI(string),其採用的是瀏覽器編碼,jsp可以自動識別。


總結:
1、 對於同一個應用,最好統一編碼,推薦為UTF-8,當然GBK也可以。
2、 正確設定JSP的pageEncoding參數
3、 在所有的JSP/Servlet中設定contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),從而間接實現對瀏覽器編碼的設定。
4、 對於請求,可以使用過濾器或者在每個JSP/Servlet中設定request.setCharacterEncoding("UTF-8")。同時,要修改Tomcat的預設配置,推薦將useBodyEncodingForURI參數設定為true,也可以將URIEncoding參數設定為UTF-8(有可能影響其他應用,所以不推薦)。

 

附:
Tomcat 相關設定:
在Tomcat的設定檔的Connector標籤中設定useBodyEncodingForURI或者URIEncoding屬性。
其中useBodyEncodingForURI參數表示是否用request.setCharacterEncoding參數對URL提交的資料和表單中GET方式提交的資料進行重新編碼,在預設情況下,該參數為false(Tomcat4.0中該參數預設為true);
URIEncoding參數指定對所有GET方式請求(包括URL提交的資料和表單中GET方式提交的資料)進行統一的重新編碼(解碼)的編碼。
URIEncoding和useBodyEncodingForURI區別是,URIEncoding是對所有GET方式的請求的資料進行統一的重新編碼(解碼),而useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding參數對資料進行的重新編碼(解碼),不同的頁面可以有不同的重新編碼(解碼)的編碼。
所以對於URL提交的資料和表單中GET方式提交的資料,可以修改URIEncoding參數為瀏覽器編碼或者修改useBodyEncodingForURI為true,並且在獲得資料的JSP頁面中request.setCharacterEncoding參數設定成瀏覽器編碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.