2013-04-24 119 views
5


百分比在發送URL之前特殊字符的編碼

我需要傳遞像#,!這樣的特殊字符。等到Facebook,Twitter和這些社交網站的URL。爲此我用URL轉義代碼替換這些字符。
return valToEncode.Replace("!", "%21").Replace("#", "%23") .Replace("$", "%24").Replace("&", "%26") .Replace("'", "%27").Replace("(", "%28") .Replace(")", "%29").Replace("*", "%2A");

它適用於我,但我想更有效地做到這一點。是否有任何其他方式來逃避這些字符?我嘗試使用Server.URLEncode(),但Facebook不會呈現它。

由於提前,
普里亞

回答

1

使用System.Web.HttpUtility.UrlEncodeSystem.Net.WebUtility.UrlEncode,而不是手動形成它。

20

如果您想與RFC3986標準(其中定義百分比編碼)兼容,則應該使用Uri.EscapeDataString方法。

例如空間總是將被編碼爲%20字符:

var result = Uri.EscapeDataString("a q"); 
// result == "a%20q" 

而對於HttpUtility.UrlEncode例如使用(它是由內部使用HttpServerUtility.UrlEncode的方式)返回+字符:

var result = HttpUtility.UrlEncode("a q") 
// result == "a+q" 

更重要的是,Uri.EscapeDataString的行爲與客戶端encodeURIComponent javascript方法兼容(除了區分大小寫,但RFC3986說這是無關緊要的)。

+1

這還取決於FB,Twitter等是否啓用了IRI IDN解析。例如Twitter 1.1有這樣的字符,例如。 「!'也必須編碼(「%21」) – mhoff 2014-03-21 09:31:33

1

對於那些仍在搜索的人來說,托馬斯B爲此提供了一個很好的單線程。

Regex.Replace(Uri.EscapeDataString(s), "[\!*\'\(\)]", Function(m) Uri.HexEscape(Convert.ToChar(m.Value(0).ToString()))) 

實測值評價this excellent answer這也提供了一種聲音解決問題的方法下。

在.NET 4.5 Uri.EscapeDataString改變行爲。

的預留和未預留的字符列表現在支持RFC 3986.

Application Compatibility in the .NET Framework 4.5

另請注意specific reserved characters RFC 3986.我沒有廣泛測試任何功能,也沒有花時間學習RFC 2396,所以我只能假設安德魯和托馬斯正在使用保留字符的子集,因爲該子集反映了RFC 2396和RFC 3986之間的差異,其餘字符已由Uri.EscapeDataString處理。

1

此代碼將爲每個rfc 3986的「PercentEncode」。HttpUtility.EncodeUrl沒有考慮許多字符('!','*','(',')'),並且不是大寫字母后面的十六進制字符%字符。

public static string PercentEncode(string value) 
{ 
    StringBuilder retval = new StringBuilder(); 
    foreach (char c in value) 
    { 
     if ((c >= 48 && c <= 57) || //0-9 
      (c >= 65 && c <= 90) || //a-z 
      (c >= 97 && c <= 122) || //A-Z      
      (c == 45 || c == 46 || c == 95 || c == 126)) // period, hyphen, underscore, tilde 
     { 
      retval.Append(c); 
     } 
     else 
     { 
      retval.AppendFormat("%{0:X2}", ((byte)c)); 
     } 
    } 
    return retval.ToString(); 
} 
+1

歡迎來到SO。請理解:這個答案真的很糟**有兩個原因:A)沒有任何格式 - 有很多幫助來了解如何格式化,甚至是**預覽**功能。使用B)「代碼只回答」是不鼓勵的。始終考慮有一些解釋。 – GhostCat 2017-06-20 12:58:34

+0

謝謝,我根據您的反饋編輯了我的答案。 – user8166689 2017-06-20 15:10:29