百分比在将特殊字符发送到URL之前对其进行编码

Pri*_*iya 9 c# asp.net urlencode url-encoding


我需要传递#,!等特殊字符 在Facebook,Twitter和此类社交网站的URL中等.为此,我用URL Escape Codes替换这些字符.

 return valToEncode.Replace("!", "%21").Replace("#", "%23")
   .Replace("$", "%24").Replace("&", "%26")
   .Replace("'", "%27").Replace("(", "%28")
   .Replace(")", "%29").Replace("*", "%2A");
Run Code Online (Sandbox Code Playgroud)

它适用于我,但我想更有效地做它.有没有其他方法来逃避这些角色?我尝试使用Server.URLEncode(),但Facebook没有呈现它.

先谢谢,
Priya

jwa*_*zko 28

如果要与RFC3986标准兼容,则应使用Uri.EscapeDataString方法,其中定义了百分比编码.

例如,空格总是被编码为%20字符:

var result = Uri.EscapeDataString("a q");
// result == "a%20q"
Run Code Online (Sandbox Code Playgroud)

例如,使用HttpUtility.UrlEncode(通过内部使用的方式HttpServerUtility.UrlEncode)返回+字符:

var result = HttpUtility.UrlEncode("a q") 
// result == "a+q"
Run Code Online (Sandbox Code Playgroud)

更重要的是,行为Uri.EscapeDataString与客户端encodeURIComponentjavascript方法兼容(除了区分大小写,但RFC3986表示它无关紧要).


Ric*_*h C 5

对于那些仍在寻找的人,Thomas B 对此提供了一段很棒的俏皮话。

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

在这个优秀答案下的评论中找到,它也为问题提供了良好的解决方案。

.Net 4.5 中的更改行为Uri.EscapeDataString

保留和非保留字符列表现在支持 RFC 3986。

请参阅.NET Framework 4.5 中的应用程序兼容性

另请注意RFC 3986 的特定保留字符。我没有广泛测试任何一个功能,也没有花时间研究 RFC 2396,因此我只能假设 Andrew 和 Thomas 使用保留字符的子集,因为该子集反映了RFC 2396 和 RFC 3986 之间的区别,其余字符已由 处理Uri.EscapeDataString


I4V*_*I4V 2

使用System.Web.HttpUtility.UrlEncodeSystem.Net.WebUtility.UrlEncode代替手动形成它。