之间有区别的服务器。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()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top