出現的問題:
透過get請求向伺服器發送請求時,如果請求參數為中文時,伺服器端接受到的參數為亂碼。
亂碼原因分析及解決方法:
1、關於解碼與編碼
編碼:'中'→1110001
解碼:1110001→'中'
亂碼:編碼和解碼過程中使用了不同的字元集
2、Web應用程式中字元編碼解碼的問題
(1)請求流程:
<1>GET請求
瀏覽器端是以UTF-8進行編碼,所以在伺服器端也應該以UTF-8進行解碼
由於GET請求參數附著在URL位址後面,所以要統一的URL位址的解碼字元集。
解決方法:
在tomcat設定檔server.xml中找到第一個connector加入以下屬性 URIEncoding=UTF-8
<2>POST請求
在取得請求參數前執行:request.setCharacterEncoding("UTF-8");
(2)回應過程
(1)指定回應資料的編碼字元集
(2)告訴瀏覽器回應資料應該使用什麼字元集進行解碼
<1>Tomcat伺服器會自動根據「解碼字元集」設定「編碼字元集」
<2>設定編碼字元集:告訴瀏覽器目前回應資料的內容類型:response.setContentType("text/html;charset=UTF-8");需要注意的是,需要在response.getWriter() ;之前設置,否則無效。
建議:
所有的過濾器都只對POST請求起作用,在jsp頁面中設定字元編碼方式,都只是對表單提交時的POST請求起作用,對GET請求不能起到設定其字元編碼的作用,
在GET請求中使用的是預設的編碼方式,所以對GET請求,需要在server.xml檔案中設定URIEncoding="UTF-8"然後重啟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");
結論:傳遞中文參數時,最好使用POST請求來提交。不同伺服器設定編碼方式可能不同,不同作業系統設定編碼方式也可能不同。
推薦:java基礎教學
以上是java中請求亂碼解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!