在AJAX瀏覽器來進行發送數據時,一般它所默認的都是UTF-8的編碼.
使用JQUERY中所提供的方法來做操作
encodeURI
function verify() {
//解決中文亂麻問題的方法1,頁面端發出的數據作一次encodeURI,
服務器段使用進行轉移成UTF-8;
//解決中文亂麻問題的方法2,頁面端發出的數據作兩次encodeURI,
這個做的好處在於,不管瀏覽器用戶在頁面來設置編碼,服務器所采用的編碼來做一次URLencode轉換成UTF-8.
var url = "AJAXServer?name=" + encodeURI(encodeURI($("#userName").val()));
url = convertURL(url);
$.get(url,null,function(data){
$("#result").html(data);
});
}
說明:1 .encodeURL函數主要是來對URI來做轉碼,它默認是采用的UTF-8的編碼.
2. UTF-8編碼的格式:一個漢字來三個字節構成,每一個字節會轉換成16進制的編碼,同時添加上%號.
這里要做兩次encodeURI的原因以及說明::
具體說明其中具體的原理分析如下,假設頁面端輸入的中文是一個“中”,按照下面步驟進行解碼
1.第一次encodeURI,按照utf-8方式獲取字節數組變成[-28,-72-83],對字節碼數組進行遍歷,把每個字節轉化成對應的16進制數,這樣就變成了[E4,B8,AD],最后變成[%E4,%B8,%AD]
2.第二次encodeURI,把數組最后變成[%25E4,%25B8,%25AD]然后就把處理后的數據[%25E4,%25B8,%25AD]發往服務器端,
當應用服務器調用getParameter方法,getParameter方法會去向應用服務器請求參數
應用服務器最初獲得的就是發送來的[%25E4,%25B8,%25AD],應用服務器會對這個數據進行URLdecode操作,URldecode操作和encodeURL操作是相反的操作,處理結果就是[%E4,%B8,%AD],並把這個值返回給getParameter方法
然后再在服務器端中調用相應的URL轉碼方法或者是函數 就可以把數據還原成最初頁面發送過來的中文“中”了。
---------------------------------------------------------------------------------
JS、C#編碼解碼
escape不編碼字符有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不編碼字符有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不編碼字符有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
1.
JS: escape :
- js使用數據時可以使用escape
- 例如:搜藏中history紀錄。
- 0-255以外的unicode值進行編碼時輸出%u****格式,其它情況下escape,encodeURI,encodeURIComponent編碼結果相同。
解碼使用:unescape
C#:
HttpUtility.UrlEncode
HttpUtility.UrlDecode
2.
JS: encodeURI :
- 進行url跳轉時可以整體使用encodeURI
- 例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");
解碼使用decodeURI();
C#: decodeURIComponent
3.
JS: encodeURIComponent :
- 傳遞參數時需要使用encodeURIComponent,這樣組合的url才不會被#等特殊字符截斷。
- 例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7& u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出</a& gt;');</script>
解碼使用decodeURIComponent()
C#:
[HttpContext.Current.]Server.UrlDecode
[HttpContext.Current.]Server.UrlEncode
------------------------------------------------------------------------------------------------------------------
URL編碼與兩次encodeURI
當使用地址欄提交查詢參數時,如果不編碼,非英文字符會按照操作系統的字符集進行編碼提交到服務器,服務器會按照配置的字符集進行解碼,所以如果兩者不一致就會導致亂碼。
encodeURI函數采用UTF-8對URL進行編碼,所以如果服務器在進行解碼時使用的是其他的編碼方式就會出現亂碼,默認的服務器配置的解碼字符集都不是UTF-8,所以大部分情況下地址欄提交中文查詢參數時會產生亂碼;針對這種情況,可以連續使用兩次encodeURI在客戶端(主要指瀏覽器)對非英文字符進行編碼,然后在服務端使用java.net.URLDecoder(String."UTF-8")解碼,即可得到正確的中文。
如果只進行一次encodeURI,得到的是UTF-8形式的URL,服務器端通過request.getParameter()解碼查詢參數(通常是iso-8859-1)就會得到亂碼。
如果進行兩次encodeURI,第一次編碼得到的是UTF-8形式的URL,第二次編碼得到的依然是UTF-8形式的URL,但是在效果上相當於首先進行了一次UTF-8編碼(此時已經全部轉換為ASCII字符),再進行了一次iso-8859-1編碼,因為對英文字符來說UTF-8編碼和ISO-8859-1編碼的效果相同。在服務器端,首先通過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解碼,編碼和解碼的過程是對稱的,所以不會出現亂碼。
encodeURL函數主要是來對URI來做轉碼,它默認是采用的UTF-8的編碼.
. UTF-8編碼的格式:一個漢字來三個字節構成,每一個字節會轉換成16進制的編碼,同時添加上%號.
假設頁面端輸入的中文是一個“中”,按照下面步驟進行解碼
1.第一次encodeURI,按照utf-8方式獲取字節數組變成[-28,-72-83],對字節碼數組進行遍歷,把每個字節轉化成對應的16進制數,這樣就變成了[E4,B8,AD],最后變成[�,�,�] 此時已經沒有了多字節字符,全部是單字節字符。
2、第二次encodeURI,進行編碼,會把%看成一個轉義字符,並不編碼%以后字符,會把%編碼成%.把數組最后變成[�,�,�]然后就把處理后的數據[�,�,�]發往服務器端,
當應用服務器調用getParameter方法,getParameter方法會去向應用服務器請求參數
應用服務器最初獲得的就是發送來的[�,�,�],應用服務器會對這個數據進行URLdecode操作,應用服務器進行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[�,�,�],因為都會把%解析成%.並把這個值返回給getParameter方法
3、再用UTF-8解碼一次,就得到"中"了。
想想看,如果不編碼兩次,當服務器自動解碼的時候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會出現亂碼。
- document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;
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");
roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");