在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
如果您想与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.UrlEncode
或System.Net.WebUtility.UrlEncode
,而不是手动形成。