13


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

在此先感谢,
普里亚

4

4 回答 4

37

如果您想与定义百分比编码的 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与客户端encodeURIComponentjavascript方法兼容(除了区分大小写,但RFC3986说它无关紧要)。

于 2013-04-24T07:47:21.113 回答
4

对于那些仍在寻找的人,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.

于 2015-05-08T08:54:25.093 回答
3

此代码将根据 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();  
}  
于 2017-06-20T12:50:11.383 回答
2

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

于 2013-04-24T07:36:27.570 回答