經過URL傳中文參數時,在服務端後臺獲取到的值每每會出現亂碼問題,解決方案有不少種,本文主要介紹如何經過encodeURI來解決中文亂碼問題:前端
first:前端傳遞參數的時候須要對中文參數進行兩次encodeURI處理:java
var requestUrl = 'url?roleName='+encodeURI(encodeURI("rowObj.appName")); 數組
注:rowObj.appName表示即將傳到後臺的帶中文的字符串服務器
second:在服務器端後臺程序代碼中要用java.net.Decode進行解碼,獲得中文:app
String appName= java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");函數
兩步搞定!ui
然而,爲何前端要進行兩次encodeURI???緣由以下:編碼
一、encodeURI函數主要是來對URI來作轉碼,它默認採用的是utf-8的編碼;url
二、常規來看,中文漢字在utf-8中通常是3個字節構成,每個字節會轉換成16進制的編碼,同時加上%號;spa
假設頁面中須要傳到後臺的中文是一個「中」字,按照下面的過程走一遍:
1)第一次encodeURI,按照utf-8的方式獲取字節數變成[-28,-72,-83],對字節碼數組進行遍歷,把每一個字節轉化成對應的16進制數,因而就變成了[E4,B8,AD],最終變成[% E4,% B8,% AD] (注意:請去掉%和編碼中間的空格,我這邊寫出來大家看到就是亂碼了,下面的這種也是同樣),此時已經沒有了多字節字符,所有都是單字節字符。
2)第二次encodeURI進行編碼,會把%看作轉義字符,而且不編碼%後面的字符,會把%變爲%25,因而剛剛的數組就變成了[% E4,% B8,% AD],而後就把處理好的[% E4,% B8,% AD]發往服務器,當應用服務器調用getparameter方法時,getparameter方法會去向應用服務器請求參數,然而應用服務器最初收到的就是從前端發來的[% E4,% B8,% AD],應用服務器容器會默認解一次碼,而容器默認解碼時採用的編碼是容器的默認編碼,多是utf-8,GBK,或者ISO-8859,都能獲得[% E4,% B8,% AD],由於會把%解析成%,而且把這個值返回給getparameter方法;
3)最終用java.net.Decode 採用utf-8編碼進行解碼,就能獲得「中」字了;
因此,若是當時只是單單編碼一次,當容易自動解碼(默認解一次碼)的時候,若是是按照 ISO-8859 去解碼 UTF-8 編碼的東西而後返回給getparameter方法就是亂碼了。
核心代碼:
js : encodeURI(encodeURI("rowObj.appName"))
java :java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");
我的小結,僅作參考,若有問題,歡迎各位大神指教,另外,感謝兩篇參考文獻,地址:
http://blog.csdn.net/howlaa/article/details/12834595
http://www.tuicool.com/articles/fuqIBju