絕大多數的開發平台包括java,c語言,python(甚至更多)在進行程式碼開發的過程中,幾乎都要用到中文。而電腦在處理這些東西的時候,它並不能辨識出你寫的東西是什麼,他會將這些資料進行編碼處理,轉換成電腦能進行辨識並執行的語言。編譯後的程式碼如果沒有反編譯的話,給我們看到的就是一堆讓人看不懂的亂碼。
首先,我們要先搞清楚為什麼會出亂碼?
伺服器是在接收和傳送資料時,是如何對資料進行編碼的?
1.伺服器傳送資料
對於傳送數據,伺服器依照response.setCharacterEncoding—contentType—pageEncoding的優先順序,對要傳送的資料進行編碼。
2.伺服器接收資料
# 接收數據,則分為三種狀況。一種是瀏覽器直接用URL提交的數據,另外兩種是用表單的GET和POST方式提交的數據。
因為三種WEB伺服器對這三種方式的處理也不相同,所以我們以Tomcat5.0為例。
①對於表單中POST方式提交的資料
只要在JSP頁面上設定了response.setCharacterEncoding或contentType或pageEncoding為"utf-8","utf-8",在接受資料的JSP/SERVLET中都不會出現中文亂碼問題。
②對於URL提交的資料和表單中GET方式提交的資料
在接收資料的JSP/SERVLET中僅設定的資料
## 在接收資料的JSP/SERVLET中僅設定為不行的## 因為在Tomcat5.0中,預設使用ISO-8859-1對URL提交的資料和表單中GET方式提交的資料重新編碼(解碼),要解決此問題:
應該在Tomcat的設定檔server.xml的Connector標籤中設定useBodyEncodingForURI或 URIEncoding屬性,其中URIEncoding參數指定對所有GET方式請求(包括URL提交的資料和表單中GET方式提交的資料資料)進行統一的重新編碼(解碼)的編碼。
其中useBodyEncodingForURI參數表示是否以request.setCharacterEncoding 參數對URL提交的資料和表單中GET方式提交的資料進行重新編碼,在預設情況下,該參數為false;
URIEncoding和useBodyEncodingForURI差異是,URIEncoding是對所有GET方式的請求的資料進行統一的重新編碼(解碼),而useBodyEncodingForURI則是根據回應該請求的頁面的request.setCharacterEncoding對資料進行的編碼(解碼),不同的頁面可以有不同的重新編碼(解碼)的編碼。所以對於URL提交的數據和表單中GET方式提交的數據,可以修改 URIEncoding參數為瀏覽器編碼或修改useBodyEncodingForURI為true,並且在獲得數據的JSP頁面中 request.setCharacterEncoding參數設定為瀏覽器編碼。
在提交JSP時對於亂碼問題,首先我們要搞清楚為什麼會出現亂碼?
看JSP的頭檔:<%@ page contentType="text/html;charset=UTF-8" language="java"%>
在這個頭檔中,還有一個與編碼的相關的屬性:pageEncoding
首先,說JSP/Servlet中的幾個編碼的作用。
在JSP/Servlet中主要有以下幾個地方可以設定編碼,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8 "、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前兩個只能用於JSP中,而後兩者可用於JSP和Servlet 中。
request.setCharacterEncoding("UTF-8")的作用是在伺服器端設定客戶端請求進行重新編碼的編碼。
此方法用於指定瀏覽器所傳送的資料重新編碼(或稱為解碼)時,所使用的編碼。
response.setCharacterEncoding("UTF-8")的功能是指定在客戶端對伺服器回應進行重新編碼的編碼。
伺服器在將資料傳送至瀏覽器前,且將資料重新編碼時,所使用的就是此編碼。
在以下總結下,以Tomcat7.0為WEB伺服器時,如何防止中文亂碼。
#1、同一個應用,最好統一編碼,建議為UTF-8,當然GBK也可以。
2、正確設定JSP的pageEncoding="UTF-8"
3、在所有的JSP/Servlet中設定contentType="text/html;charset= UTF-8"或response.setCharacterEncoding("UTF-8"),從而間接實作瀏覽器編碼的設定。
4、對於非表單提交的get或url請求,可以修改Tomcat的預設配置,建議將useBodyEncodingForURI參數設為true,也可以將URIEncoding參數設為 UTF-8(有可能影響其他應用,所以不建議)。或用下面的方法,在接收資料時處理:
request.getParameter("userID"),得到userID的值
# request.getParameter("userID" ).trim()將這個值去掉兩邊的空格
request.getParameter("userID").trim().getBytes("ISO-8859-1"))將這個String用ISO -8859-1編碼成一個位元組數祖
new String(request.getParameter("userID").trim().getBytes("ISO-8859-1"),"utf- 8")將剛才的位元組數祖傳進string的建構子依照"utf-8"編碼建立一個string物件。
5.使用URLEncoder的方法
傳參前用:
//使用指定的編碼機制將字串轉換為application/x-www-form-urlencoded 格式
String username_encoder = URLEncoder.encode(username,"UTF-8");
接參數後顯示使用:
//使用指定的編碼機制對 application/x-www-form-urlencoded 字串解碼
String username_decoder = URLDecoder.decode(request.getParameter(" username"),"UTF-8");
以上是jsp如何處理中文亂碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!