我需要传递#,!等特殊字符在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无法呈现它。
提前致谢,
普里亚
答案 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.UrlEncode
或System.Net.WebUtility.UrlEncode
代替手动形成。