1. 程式人生 > >為什麽要兩次調用encodeURI來解決亂碼問題

為什麽要兩次調用encodeURI來解決亂碼問題

d+ 方法 coder gbk 輸入 轉化 自動 gpo 轉換

.encodeURL函數主要是來對URI來做轉碼,它默認是采用的UTF-8的編碼.
. UTF-8編碼的格式:一個漢字來三個字節構成,每一個字節會轉換成16進制的編碼,同時添加上%號.

假設頁面端輸入的中文是一個“中”,按照下面步驟進行解碼

1.第一次encodeURI,按照utf-8方式獲取字節數組變成[-28,-72-83],對字節碼數組進行遍歷,把每個字節轉化成對應的16進制數,這樣就變成了[E4,B8,AD],最後變成[%E4,%B8,%AD] 此時已經沒有了多字節字符,全部是單字節字符。

2、第二次encodeURI,進行編碼,會把%看成一個轉義字符,並不編碼%以後字符,會把%編碼成%25.把數組最後變成[%25E4,%25B8,%25AD]然後就把處理後的數據[%25E4,%25B8,%25AD]發往服務器端,
當應用服務器調用getParameter方法,getParameter方法會去向應用服務器請求參數
應用服務器最初獲得的就是發送來的[%25E4,%25B8,%25AD],應用服務器會對這個數據進行URLdecode操作,應用服務器進行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[%E4,%B8,%AD],因為都會把%25解析成%.並把這個值返回給getParameter方法

3、再用UTF-8解碼一次,就得到"中"了。

想想看,如果不編碼兩次,當服務器自動解碼的時候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會出現亂碼。

JS:

document.authorityForm.action = basePath3+"User_viewUser.do?

id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;

 

JAVA後臺:

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

原文地址:http://blog.csdn.net/howlaa/article/details/12834595

為什麽要兩次調用encodeURI來解決亂碼問題