Server.UrlEncode与HttpUtility.UrlEncode

时间:2009-03-02 15:00:58

标签: asp.net .net urlencode

Server.UrlEncode与HttpUtility.UrlEncode之间有区别吗?

6 个答案:

答案 0 :(得分:250)

我之前对这些方法感到非常头疼,我建议您避免 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%true”==> “100 %% 20true”(好吧,你的网址现在已经破了)
  • “test A.aspx#anchor B”==> “试验%20A.aspx的#锚%20B
  • “test A.aspx?hmm#anchor B”==> “test%20A.aspx?hmm #anchor B ”(注意与之前的转义序列的区别!

它还具有可爱的特定MSDN文档“对URL字符串的路径部分进行编码,以便从Web服务器向客户端进行可靠的HTTP传输。” - 没有实际解释它的作用。你不太可能用Uzi射击自己...

简而言之,请坚持 Uri.EscapeDataString

答案 1 :(得分:128)

HttpServerUtility.UrlEncode将在内部使用HttpUtility.UrlEncode。没有具体的区别。 Server.UrlEncode存在的原因是与传统ASP的兼容性。

答案 2 :(得分:40)

自从第一次提出这个问题以来快进了近9年,在.NET Core和.NET Standard的世界中,我们对URL编码最常见的选择是 WebUtility.UrlEncode (在System.Net下)和 Uri.EscapeDataString 。从这里和其他地方最受欢迎的答案来看, Uri.EscapeDataString 似乎更可取。但是吗?我做了一些分析来理解差异,这就是我想出的:

  • WebUtility.UrlEncode将空格编码为+; Uri.EscapeDataString将其编码为%20
  • Uri.EscapeDataString百分比编码!()*; WebUtility.UrlEncode没有。
  • WebUtility.UrlEncode百分比编码~; Uri.EscapeDataString没有。
  • Uri.EscapeDataString会在超过65,520个字符的字符串上抛出UriFormatException; WebUtility.UrlEncode没有。 (A more common problem than you might think, particularly when dealing with URL-encoded form data。)
  • Uri.EscapeDataStringhigh surrogate characters上抛出UriFormatException; WebUtility.UrlEncode没有。 (这是一个UTF-16的东西,可能不太常见。)

对于URL编码目的,字符符合以下3个类别之一:unreserved(URL中合法);保留(合法但具有特殊含义,因此可能想要对其进行编码);和其他一切(必须始终编码)。

根据RFC,保留字符为::/?#[]@!$&'()*+,;=

未保留的字符是字母数字和-._~

判决

Uri.EscapeDataString 清楚地定义了它的任务:% - 编码所有保留和非法字符。 WebUtility.UrlEncode 在定义和实现方面都更加模糊。奇怪的是,它编码了一些保留字符而不是其他字符(为什么括号而不是括号?),而且陌生人仍然编码那个天真无保留的~字符。

因此,我同意流行的建议 - 尽可能使用 Uri.EscapeDataString ,并了解像/?这样的保留字符会被编码。如果您需要处理可能较大的字符串,尤其是URL编码的表单内容,则需要依靠 WebUtility.UrlEncode 并接受其怪癖,或以其他方式解决问题。 / p>

编辑:我attempted通过Url.EncodeUrl.EncodeIllegalCharacters和{Flurl来纠正上述{3}}中提到的所有怪癖{1}}静态方法。它们位于core package(很小,不包括所有HTTP内容),或者可以随意从源代码中删除它们。我欢迎你对这些提出任何意见/反馈。

以下是我用来发现哪些字符编码方式不同的代码:

Url.Decode

答案 3 :(得分:26)

请记住,您可能不应该使用其中任何一种方法。 Microsoft的Anti-Cross Site Scripting Library包含HttpUtility.UrlEncodeHttpUtility.HtmlEncode的替换,这些替换更符合标准,更安全。作为奖励,您也可以获得JavaScriptEncode方法。

答案 4 :(得分:10)

Server.UrlEncode()用于向后兼容Classic ASP,

Server.UrlEncode(str);

相当于:

HttpUtility.UrlEncode(str, Response.ContentEncoding);

答案 5 :(得分:4)

同样,Server.UrlEncode()来电HttpUtility.UrlEncode()