在将特殊字符发送到URL之前,需要使用百分比编码对其进行编码。

17

我需要在URL中向Facebook、Twitter和其他社交网站传递特殊字符,例如#、!等。为此,我将这些字符替换为URL转义代码。

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

对我来说它起作用了,但我希望更有效率地完成它。是否有其他方法可以转义这些字符?我试过使用Server.URLEncode(),但 Facebook 没有渲染它。

提前致谢,
Priya

4个回答

44

如果您想要与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

5
对于那些仍在寻找的人,Thomas B提供了一个很好的一行代码解决方案。
Regex.Replace(Uri.EscapeDataString(s), "[\!*\'\(\)]", Function(m) Uri.HexEscape(Convert.ToChar(m.Value(0).ToString())))

这个优秀答案下的评论中发现了这个问题的解决方案。
.Net 4.5中Uri.EscapeDataString行为发生了变化。

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

请参见.NET Framework 4.5中的应用程序兼容性
还要注意RFC 3986的特定保留字符。 我没有广泛测试过两个函数,也没有花时间研究RFC 2396,因此我只能假设Andrew和Thomas使用了保留字符的子集,因为该子集反映了RFC 2396和RFC 3986之间的差异,并且其余字符已经由Uri.EscapeDataString处理。

3

这段代码将根据rfc 3986进行"百分号编码"。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();  
}  

2
欢迎来到Stack Overflow。请理解:这个答案有两个非常糟糕的原因:A)没有任何格式 - 有很多帮助可以了解如何格式化,甚至还有一个预览功能。使用它!B)"仅代码答案"是被反对的。始终考虑一些解释。 - GhostCat
3
谢谢,我已经根据您的反馈编辑了我的回答。 - user8166689

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接