JSP頁面提交資料時中文亂碼問題的解決
阿新 • • 發佈:2018-12-30
JSP頁面提交含中文的資料時,如果是POST方式提交資料,在request.getParameter("valueName");前面加上 request.setCharacterEncoding("UTF-8"); 便可解決中文資料裡面的問題。如果是GET方式或位址列方式提交含中文的資料時,解決亂碼的方法如下。
解決GET方式提交資料中文亂碼的方法
GET方式提交的引數編碼,只支援iso8859-1編碼。因此,提交含中文的資料時,在後臺就需要轉換編碼,如下:
String value= new String(request.getParameter("value").getBytes("iso8859-1"),"utf-8");
前提是前端頁面編碼就是utf-8,如果是gbk,那程式碼後面就得改成gbk。
然後修改tomcat的conf/server.xml檔案如下:
<Connector connectionTimeout="20000"
port="8080" protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"/>
解決位址列提交資料中文亂碼的方法
當使用位址列提交查詢引數時,非英文字元會按照作業系統的字符集進行編碼提交到伺服器,伺服器會按照配置的字符集進行解碼,如果兩者不一致就會導致亂碼。encodeURI函式採用UTF-8對URL進行編碼,如果伺服器在進行解碼時使用的是其他的編碼方式就會出現亂碼,因為預設的伺服器配置的解碼字符集都不是UTF-8,因此大部分情況下位址列提交中文查詢引數時會產生亂碼。針對這種情況,可以連續使用兩次encodeURI在客戶端(主要指瀏覽器)對非英文字元進行編碼,然後在服務端使用java.net.URLDecoder.decode(String."UTF-8")
如果只進行一次encodeURI,得到的是UTF-8形式的URL,伺服器端通過request.getParameter()解碼引數(通常是iso-8859-1)就會得到亂碼。如果進行兩次encodeURI,第一次編碼得到的是UTF-8形式的URL,第二次編碼得到的依然是UTF-8形式的URL,但是在效果上相當於首先進行了一次UTF-8編碼(此時已經全部轉換為ASCII字元),再進行了一次iso-8859-1編碼,對英文字元來說UTF-8編碼和ISO-8859-1編碼的效果相同。在伺服器端,首先通過request.getParameter()自動進行第一次解碼(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,對結果無影響)得到ascii字元,然後再使用UTF-8進行第二次解碼,通常使用java.net.URLDecoder.decode("","UTF-8");
兩次編碼兩次解碼的過程為:
UTF-8編碼->UTF-8(iso-8859-1)編碼->iso-8859-1解碼->UTF-8解碼,編碼和解碼的過程是對稱的,所以不會出現亂碼。
encodeURL函式主要是來對URI來做轉碼,它預設是採用的UTF-8的編碼,UTF-8編碼的格式:一個漢字來三個位元組構成,每一個位元組會轉換成16進位制的編碼,同時新增上%號。
示例:
JSP頁面程式碼:
<a href="javascript: location.href='${pageContext.request.contextPath}/servletName?value='+encodeURI(encodeURI('中文資料'));">跳轉</a>
java程式碼:
String value = java.net.URLDecoder.decode(request.getParameter("value"), "UTF-8");
本文部分資料摘自: