request.getParameter() 中文亂碼解決方法

今天測試服務器突然有個頁面的jsp發生亂碼,經排查是request.getParameter()獲取參數時發生亂碼,解決後特記錄此筆記

 

原因:Http請求傳輸時將url以ISO-8859-1編碼,服務器收到字節流後默認會以ISO-8859-1編碼來解碼成字符流(造成中文亂碼)

解決辦法:我們需要把request.getParameter(“參數名”)獲取到的字符串先用ISO-8859-1編碼成字節流,然後再將其用utf-8解碼成字符流

代碼:

String str = new String(request.getParameter("參數名").getBytes("iso-8859-1"), "utf-8");  

這是通過轉碼的方式處理亂碼問題,我們也可以通過Tomcat配置文件,設置URL編碼集(URIEncoding)設置編碼,這種方法也是一勞永逸的,

修改Tomcat/conf 目錄下 server.xml

<Connector URIEncoding="UTF-8" acceptCount="1500" connectionTimeout="20000" enableLookups="false" maxSpareThreads="100" maxThreads="1000" minSpareThreads="25" port="9082" protocol="HTTP/1.1" useBodyEncodingForURI="true"/>

重點在 userBodyEncodingForURI 和 URIEncoding 這兩個屬性

下面來解釋一下這兩個屬性的意義

useBodyEncodingForURI參數表示是否用request.setCharacterEncoding參數對URL提交的數據和表單中GET方式提交的數據進行重新編碼,在默認情況下,該參數爲false。

URIEncoding參數指定對所有GET方式請求進行統一的重新編碼(解碼)的編碼。

URIEncoding和useBodyEncodingForURI區別是,

URIEncoding是對所有GET方式的請求的數據進行統一的重新編碼,

而useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding參數對數據進行的重新編碼,不同的頁面可以有不同的重新編碼的編碼。

插入到MySQL數據庫後就是亂碼。mysql的my.ini文件設置的是utf8,這些都沒得問題,但是插入數據庫還是亂碼。

解決辦法,在連接數據庫類裏面的url參數設置如下:

jdbc:mysql://localhost:3306/db_diary?useUnicode=true&characterEncoding=UTF-8

在後面加上這兩個參數。就不是亂碼了。

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/enterprise?useUnicode=true&characterEncoding=UTF-8
username=root
password=brozer

頁面加上編碼設置

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章