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

时间:2013-04-24 07:32:36

标签: 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");

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

提前致谢,
普里亚

4 个答案:

答案 0 :(得分:27)

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

例如,空格总是被编码为%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 :(得分:2)

对于那些仍在寻找的人来说,托马斯B为此提供了一个很好的单行。

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

this excellent answer下的评论中找到,这也为问题提供了一个合理的解决方案。

。{4.5}中Uri.EscapeDataString的行为发生了变化。

  

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

请参阅Application Compatibility in the .NET Framework 4.5

另请注意RFC 3986的specific reserved characters。我还没有对广泛的功能进行测试,也没有花时间研究RFC 2396,所以我只能假设安德鲁和托马斯正在使用其中的一部分保留字符,因为该子集反映了RFC 2396和RFC 3986之间的差异,其余字符已由Uri.EscapeDataString处理。

答案 2 :(得分:2)

此代码将为每个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();  
}  

答案 3 :(得分:1)

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