2013-04-24 76 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