在URL中发送特殊字符之前的百分比编码

本文关键字:百分比 编码 特殊字符 URL | 更新日期: 2023-09-27 18:10:33


我需要传递特殊字符,如#,!在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没有渲染它。

提前感谢,
Priya

在URL中发送特殊字符之前的百分比编码

如果您想与RFC3986标准兼容,则应该使用**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表示它无关紧要(。

对于那些仍在搜索的人,Thomas B为此提供了一个很好的一行代码。

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

在评论中找到了这个优秀的答案,这也为问题提供了一个合理的解决方案。

Uri.EscapeDataString的行为在.Net 4.5中发生了变化。

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

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

还要注意RFC 3986的特定保留字符。我没有对这两个功能进行广泛的测试,也没有花时间研究RFC 2396,所以我只能假设Andrew和Thomas使用了保留字符的子集,因为该子集反映了RFC 2396和RFC 3986之间的差异,其余字符已经由Uri.EscapeDataString处理。

此代码将根据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();  
}  

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