一:get請求url中帶有中文參數,有三種方式進行處理防止中文亂碼
1、如果使用tomcat作為服務器,那么修改tomcat配置文件conf/server.xml中,在 <Connector port="8082" protocol="HTTP/1.1" 中加入 URIEncoding="utf-8"的編碼集
2、前台需要對中文參數進行編碼,調用js方法encodeURI(url),將url編碼,然后請求。
后台接受時,需處理String str = new String(request.getParameter("param").getBytes("iso8859-1"),"UTF-8");
原因:tomcat不設置編碼時,默認是iso8859-1,即tomcat默認會以iso8859-1編碼接收get參數。 以上操作是將參數以iso8859-1編碼轉化為字節數組,然后再以UTF-8將字節數組轉化為字符串。
另外需注意在框架的使用中:request.setCharacterEncoding(encoding);只對post請求有效。而且,spring的CharacterEncodingFilter也只是做了request(和response).setCharacterEncoding(encoding);的操作。所以spring的filter配置不作用於get參數接收。
3、解決get請求,后台接受中文參數亂碼處理的方法(搜索功能帶參數)
(1)前台獲取數據,在js中進行編碼處理
encodeURI函數采用utf-8進行編碼,而在服務器的進行解碼時候,默認都不是以uft-8進行解碼,所以就會出現亂碼。
兩次encodeURI,第一次編碼得到的是UTF-8形式的URL,第二次編碼得到的依然是UTF-8形式的URL,但是在效果上相當於首先進行了一 次UTF-8編碼(此時已經全部轉換為ASCII字符),再進行了一次iso-8859-1編碼,因為對英文字符來說UTF-8編碼和ISO- 8859-1編碼的效果相同。
(2)后台解碼處理
在后台接收參數時候,首先通過request.getParameter()自動進行第一次解碼(可能是 gb2312,gbk,utf-8,iso-8859-1等字符集,對結果無影響)得到ascii字符,然后再使用UTF-8進行第二次解碼,通常使用 java.net.URLDecoder("","UTF-8")方法。
兩次編碼兩次解碼的過程為:
UTF-8編碼->UTF-8(iso-8859-1)編碼->iso-8859-1解碼->UTF-8解碼,編碼和解碼的過程是對稱的,所以不會出現亂碼。
注:
1:這種兩次encodeURI方式不用去知道服務器的解碼方式,也可以得到正確的數據。
2:get請求建議盡量不帶中文參數,如果使用建議使用兩次encodeURI進行編碼
3.參考資料 URL編碼與兩次encodeURI:http://blog.sina.com.cn/s/blog_8af112fd0102vxb7.html
---------------------