服务器。UrlEncode与HttpUtility.UrlEncode
题
之间有区别的服务器。UrlEncode和HttpUtility.UrlEncode?
解决方案
HttpServerUtility.UrlEncode
将在内部使用 HttpUtility.UrlEncode
。没有具体的区别。 Server.UrlEncode
存在的原因是与传统ASP兼容。
其他提示
我有重要头痛用这些方法之前, 我建议你 避免 任何变的 UrlEncode
, ,而不是使用 Uri.EscapeDataString
-至少这一具有一种易于理解的行为。
让我们看看...
HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
//standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
// want, since you still need to
// escape special characters yourself
但是我个人最喜欢了 HttpUtility.UrlPathEncode -这个东西是真的不可理解的。它编码:
- " " ==> "%20"
- "100%的真实"==>"100%%20true"(ok,你的网址是打破现在)
- "试验A.aspx#anchor B"==>"测试%20A。aspx#anchor%20B"
- "试验A.aspx?嗯#anchor B"==>"测试%20A。aspx?hmm#anchor B" (注意差别与以前的逃生顺序!)
它也有lovelily具体MSDN文件"编码的路径部网址串可靠HTTP传输网络服务器向一个客户。" -没有实际上说明它做什么。你是不太可能搬起石头砸自己的脚有一个乌兹...
在短短的,坚持下去 Uri。EscapeDataString.
快速前进的几乎9年以来这是第一要求,并在世界。净的核心。净的标准,这似乎是最常见的选择,我们已为网址的编码是 WebUtility.UrlEncode (下 System.Net
)和 Uri。EscapeDataString.判断由最受欢迎的答案在这里和其他地方, Uri。EscapeDataString 似乎是可取的。但是吗?我做了一些分析,以了解差异,这就是我想出了:
WebUtility.UrlEncode
编码的空间+
;Uri.EscapeDataString
对它进行编码为%20
.Uri.EscapeDataString
百分比编码!
,(
,)
, ,*
;WebUtility.UrlEncode
不。WebUtility.UrlEncode
百分比编码~
;Uri.EscapeDataString
不。Uri.EscapeDataString
抛出了一个UriFormatException
在串的长于65,520字;WebUtility.UrlEncode
不。(一个更普遍的问题可能比你想象,特别是在处理与网址的编码形式的数据.)Uri.EscapeDataString
抛出了一个UriFormatException
在 高代理人物;WebUtility.UrlEncode
不。(这是一个UTF-16件事情,可能是很不常见的。)
URL-编的目的,符合成3类:毫无保留的(法律在URL);保留的(合法的,但具有特殊的意义,所以你 可能会 希望对其进行编码);和一切其他(总是必须编码)。
根据 RFC, ,保留的人物是: :/?#[]@!$&'()*+,;=
和毫无保留的字符字母数字和 -._~
判决
Uri。EscapeDataString 明确规定其任务:%-进行编码,所有保留和非法符。 WebUtility.UrlEncode 是更多的不确定在这两种定义和执行。奇怪的是,它编码的一些保留符,但不是其他的(为什么括号中,并不架??), 和陌生人仍它编码,毫无保留的无辜 ~
符。
因此,我同意受欢迎的建议-使用 Uri。EscapeDataString 当可能的,并理解保留的字样 /
和 ?
将获取的编码。如果你需要处理具有潜在的大型字符串,尤其是用网址的编码形式的内容,只需要回落 WebUtility.UrlEncode 并接受其怪癖,或其工作围绕这一问题。
编辑: 我 尝试 为纠正所有的怪癖上所述在 Flurl 通过 Url.Encode
, Url.EncodeIllegalCharacters
, , Url.Decode
静态的方法。这些都是在 核心包装 (这是微小的,并不包括所有HTTP的东西),或随意撕裂他们的来源。我欢迎任何评论/意见你有这些。
这里的代码,我在使用的探索字符编码不同的:
var diffs =
from i in Enumerable.Range(0, char.MaxValue + 1)
let c = (char)i
where !char.IsHighSurrogate(c)
let diff = new {
Original = c,
UrlEncode = WebUtility.UrlEncode(c.ToString()),
EscapeDataString = Uri.EscapeDataString(c.ToString()),
}
where diff.UrlEncode != diff.EscapeDataString
select diff;
foreach (var diff in diffs)
Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");
请记住,您可能不应该使用其中任何一种方法。 Microsoft的反跨站点脚本库包括替换 HttpUtility.UrlEncode
和 HttpUtility.HtmlEncode
,它们更符合标准,更安全。作为奖励,您还可以获得 JavaScriptEncode
方法。
Server.UrlEncode()用于向后兼容Classic ASP,
Server.UrlEncode(str);
相当于:
HttpUtility.UrlEncode(str, Response.ContentEncoding);
同样, Server.UrlEncode()
调用 HttpUtility.UrlEncode()