設定編碼的方式分為:
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參數設定成瀏覽器編碼。