1. 程式人生 > >get/post請求中文亂碼問題

get/post請求中文亂碼問題

所有的過濾器都只對post請求起作用,在jsp頁面中設定字元編碼方式,都只是對錶單提交請求時的post請求起作用,對get請求不能起到設定其字元編碼的作用,在get請求中使用的是預設的編碼方法,所以對get請求,應該在server.xml檔案中設定URIEncoding="GBK"然後重啟tomcat便可以實現解決中文亂碼問題,但是不建議在href超連結請求中傳達中文引數,也不建議在get請求中傳遞中文引數。另外對傳遞的部分中文實現傳遞和接收時的統一的編碼方法在傳達引數時使用"reply.jsp?title="+java.net.URLEncoder.encode(keywords)然後在接收引數頁面使用keywords=new String(request.getParameter("keywords").getBytes("8859_1"));這種方式雖然暫時解決了中文亂碼問題,但是在後期的維護和部署到其他的伺服器時可以仍會會出現中文亂碼了問題,所以不建議使用。

對於Post請求,只需在Servlet或者jsp中寫入如下程式碼就可以把解決從表單中傳入的中文亂碼問題

 request.setCharacterEncoding("utf-8");

而對於Get請求,因為請求引數會被附加到位址列的URL之後,所以不能用上面的處理方法。應該這樣:

   String str=request.getQueryString();

   //使用URLDecoder解碼字串

   String str1=java.net.URLDecoder.decode(str,"utf-8");

   String[] paraStrings=str1.split("&");

//paraStrings[0]就是第一個引數,依次類推...

   for(String paraString : paraStrings)

{

     String[] nameValue=paraString.split("=");

     //nameValue[0]就是表單的name,nameValue[1]就是表單name對應的值

}

還有一種方法就是獲取請求引數之後對請求引數值重新編碼,也就是先將其轉換成位元組陣列,再將位元組陣列重新解碼成字串。

  String str=request.getParameter("name");

  byte[] bytes=str.getBytes("ISO-8859-1");

  String name=new String(bytes,"utf-8");

第一步:

request.setCharacterEncoding("utf-8");

然後:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8");

使用get傳遞中文資料的時候,在傳引數之前先把引數進行轉碼:java.net.URLEncoder.encode(param);

接收的時候用語句java.net.URLDecoder.decode(param);再轉回中文

表單提交(GET或POST)中文亂碼解決方案    對於表單中POST方式提交的資料,只要在接收資料的JSP或者Servlet中正確設定


request.setCharacterEncoding引數,即將對客戶端請求進行重新編碼的編碼設定成瀏覽器編碼,就可以保證得到的引數編碼正確


。有些讀者可能會問,那如何得到瀏覽器編碼呢?上面我們提過了,在預設請情況下,瀏覽器編碼就是你在響應該請求的JSP頁面或


者Servlet中response.setCharacterEncoding設定的值。   對於URL提交的資料和表單中GET方式提交的資料,在接收資料的JSP中


設定request.setCharacterEncoding引數是不行的,因為在Tomcat5.0版本以上中,預設情況下使用ISO- 8859-1對URL提交的資料和


表單中GET方式提交的資料進行重新編碼(解碼),而不使用該引數對URL提交的資料和表單中GET方式提交的資料進行重新編碼(解


碼)。要解決該問題,應該在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引數設定成瀏覽器編碼