2014-02-18 113 views
2

我試圖對一些字符串進行URL編碼,但是我使用.Net框架提供的方法存在問題。URL編碼ASCII/UTF16字符

例如,我正在嘗試包含'â'字符的編碼字符串。例如,根據w3schools,我希望這個caracter被編碼爲'%E2'(我必須調用一個PHP系統也期望這個...)。

我嘗試使用以下方法:

System.Web.HttpUtility.UrlEncode("â"); 
System.Web.HttpUtility.UrlPathEncode("â"); 
Uri.EscapeUriString("â"); 
Uri.EscapeDataString("â"); 

然而,它們都編碼這個字符爲: %C3%A2

我想這事做的事實,在.net中的字符串是UTF-16編碼的。因此,爲了避免這個問題,我可以這樣寫,例如:

"%" + ((int)character).ToString("X") 

不過,我想知道,如果框架已經有一個內置的方法(我不能在這裏或其他地方找到任何答案爲什麼我的角色是這樣編碼的)?

回答

4

的原因是,.NET使用UTF-16編碼的字符串。其原因是,該UrlEncode(string) overload默認使用UTF-8,和%C3%A2â正確UTF-8編碼:

的HttpUtility.UrlEncode方法默認使用UTF-8編碼。因此,使用UrlEncode方法提供了與使用UrlEncode方法和指定UTF8作爲第二個參數相同的結果。

如果你喜歡不同的編碼(例如Latin-1或代碼頁1252,其中â對應於%E2),則可以使用另一種過載,允許你指定編碼:

var x = HttpUtility.UrlEncode("â", Encoding.GetEncoding(1252)); 
+0

由於兩者的您。我沒有注意到有超載......我給你答案,因爲你是第一個回答。 – Matthieu

3

只是通過正確的編碼,以System.Web.HttpUtility.UrlEncodeWindows-1252Windows-1254ISO-8859-1ISO-8859-9等取其合適)

var s = HttpUtility.UrlEncode("â", Encoding.GetEncoding("Windows-1252"));