URL傳中文參數導致亂碼的解決方案之encodeURI


通過URL傳中文參數時,在服務端后台獲取到的值往往會出現亂碼問題,解決方案有很多種,本文主要介紹如何通過encodeURI來解決中文亂碼問題:

first:前端傳遞參數的時候需要對中文參數進行兩次encodeURI處理:

​var requestUrl = 'url?roleName='+encodeURI(encodeURI("rowObj.appName")); 

:rowObj.appName​表示即將傳到后台的帶中文的字符串

​second:在服務器端后台程序代碼中要用java.net.Decode進行解碼,得到中文:

String appName= java.net.URLDecoder.decode(request.getParameter("roleName"),"UTF-8");

兩步搞定!

然而,為什么前端要進行兩次encodeURI???原因如下:

1、encodeURI函數主要是來對URI來做轉碼,它默認采用的是utf-8的編碼;​

2、常規來看,中文漢字在utf-8中一般是3個字節構成,每一個字節會轉換成16進制的編碼,同時加上%號;

 

假設頁面中需要傳到后台的中文是一個“中”字,按照下面的過程走一遍:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM