1. 程式人生 > >JSP頁面提交資料時中文亂碼問題的解決

JSP頁面提交資料時中文亂碼問題的解決

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");

本文部分資料摘自: