隨筆-23  評論-0  文章-5  trackbacks-0

          今天遇到調(diào)用encodeURL調(diào)用二次的疑問,雖然之前知道要調(diào)用二次,但是具體不是太清楚里面具體的運行過程,這是轉(zhuǎn)載的這個寫的比較詳細,把整個運行過程詳細解讀了一下,非常不錯所以轉(zhuǎn)載過了供其他人分享。
          .encodeURL函數(shù)主要是來對URI來做轉(zhuǎn)碼,它默認是采用的UTF-8的編碼.

          . UTF-8編碼的格式:一個漢字來三個字節(jié)構(gòu)成,每一個字節(jié)會轉(zhuǎn)換成16進制的編碼,同時添加上%號.

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

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

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

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

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

          JS:

          1. document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;  


          JAVA后臺:
             

          1. roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");  
          posted on 2015-08-18 11:20 ForMeBlog 閱讀(425) 評論(0)  編輯  收藏 所屬分類: JSP基礎(chǔ)類
          主站蜘蛛池模板: 郸城县| 长宁县| 镇康县| 屏东县| 玉溪市| 吉木萨尔县| 岳西县| 阳信县| 镇巴县| 承德县| 霍山县| 靖江市| 南昌市| 怀宁县| 慈溪市| 论坛| 墨竹工卡县| 伽师县| 勃利县| 社会| 鹤山市| 方城县| 凌源市| 萨嘎县| 明水县| 永宁县| 海口市| 朝阳县| 洪湖市| 都兰县| 包头市| 无棣县| 隆回县| 达州市| 格尔木市| 平江县| 长寿区| 洪洞县| 泰州市| 莱西市| 屏南县|