JS、C#中URL編碼解碼問題

yinghualeihenmei發表於2024-08-19

原文連結:https://www.sohu.com/a/468486142_120537920

JavaScript中編碼有三種方法:escape、encodeURI、encodeURIComponent。

escape

eacape是BOM(瀏覽器物件模型(Browser Object Model))中的方法,只能對ASCII符號正確編碼,而encodeURI、encodeURIComponent可以對所有的Unicode符號編碼。

escape不編碼字元有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z

對應解碼方法:unescape()

encodeURI 用於對網址編碼(不包含引數)

encodeURI不編碼字元有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURI不對URI中的特殊字元進行編碼,如冒號(:)、斜槓(/)。因此此方法可用於對網址進行編碼。由於encodeURI不對冒號(:)、斜槓(/)進行編碼,所以如果引數(如把網址作為引數)中包含冒號(:)、斜槓(/),就會解析出錯,所以此方法不能對引數進行編碼。

對應解碼方法:decodeURI()

encodeURIComponent 用於對網址引數進行編碼

encodeURIComponent不編碼字元有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

可以看到此方法對:/都進行了編碼,所以不能用它來對網址進行編碼。由於此方法對中文,空格,井號(#),斜線(/),冒號(:)都進行了編碼,所以適合對URI中的引數進行編碼。

對應解碼方法:decodeURIComponent()

對於中文字串來說,如果不希望把字串編碼格式轉化成UTF-8格式(比如原頁面和目標頁面的charset是一致時候),只需要使用 escape。如果你的頁面是GB2312或者其他的編碼,而接受引數的頁面是UTF-8編碼,就要採用encodeURI或者 encodeURIComponent。

C#中編碼主要方法:HttpUtility.UrlEncode、Server.UrlEncode、Uri.EscapeUriString、Uri.EscapeDataString

Server.UrlEncode && HttpUtility.UrlEncode

這兩個方法在絕大多數情況下是一樣的。它們的區別是HttpUtility.UrlEncode預設使用UTF8格式編碼,而Server.UrlEncode是使用系統預設格式編碼,Server.UrlEncode使用系統預設編碼做為引數呼叫HttpUtility.UrlEncode編碼,所以如果系統全域性都用UTF8格式編碼,這兩個方法就是一樣的。

HttpUtility.UrlEncode對冒號(:)和斜槓(/)進行了編碼,所以不能用來對網址進行編碼。也不能對引數進行編碼,因為在引數中空格應該被編碼為%20而不是被HttpUtility.UrlEncode編碼為加號(+),所以不推薦用這兩個方法對URI進行編碼。

兩者對應解碼方法:Server.UrlDecode 、HttpUtility. UrlDecode

Uri.EscapeUriString 用於對網址編碼(不包含引數)

Uri.EscapeUriString對空格進行了編碼,也對中文進行了編碼,但對冒號(:)、斜槓(/)和井號(#)未編碼,所以此方法可以用於網址進行編碼,但不能對引數進行編碼,作用類似JavaScript中的encodeURI方法。

Uri.EscapeDataString 用於對網址引數進行編碼

Uri.EscapeDataString對冒號(:)、斜槓(/)、空格、中文、井號(#)都進行了編碼,所以此方法不可以用於網址進行編碼,但可以用於對引數進行編碼,作用類似JavaScript中的encodeURIComponent方法。

在JavaScript中推薦的做法是用encodeURI對URI的網址部分編碼,用encodeURIComponent對URI中傳遞的引數進行編碼。

在C#中推薦的做法是用Uri.EscapeUriString對URI的網址部分編碼,用Uri.EscapeDataString對URI中傳遞的引數進行編碼。

在網址作為引數進行傳遞時,C#中用HttpUtility.UrlEncode方法進行編碼,JavaScript中用unescape()方法解碼是有效的。如:傳遞的URL引數是http://localhost:54904/user/ShopCart.aspx

'/login/login.aspx?ReturnUrl="+ System.Web.HttpUtility.UrlEncode(“http://localhost:54904/user/ShopCart.aspx”) + "'

編碼後的結果:/login/login.aspx?ReturnUrl=http%3a%2f%2flocalhost%3a54904%2fuser%2fShopCart.aspx

在JavaScript獲取引數ReturnUrl解碼時用unescape(ReturnUrl)是可行的。

解碼後的結果ReturnUrl=http://localhost:54904/user/ShopCart.aspx

JavaScript中漢字在作為引數傳遞時如:&body=" + encodeURI(”漢字“),可以直接用encodeURI()方法編碼,如果需要加密則在編碼後再加密;在C#接收引數時,如果是加密之後先解密,再獲取引數,使用Request["body"].ToString()預設採用HttpUtility. UrlDecode方法進行解碼,前提兩者預設編碼方式都是UTF-8。

相關文章