Server.UrlEncode与HttpUtility.UrlEncode之间有区别吗?
答案 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 - 这件事真是难以理解。它编码:
它还具有可爱的特定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.EscapeDataString
在high surrogate characters上抛出UriFormatException
; WebUtility.UrlEncode
没有。 (这是一个UTF-16的东西,可能不太常见。)对于URL编码目的,字符符合以下3个类别之一:unreserved(URL中合法);保留(合法但具有特殊含义,因此可能想要对其进行编码);和其他一切(必须始终编码)。
根据RFC,保留字符为::/?#[]@!$&'()*+,;=
未保留的字符是字母数字和-._~
Uri.EscapeDataString 清楚地定义了它的任务:% - 编码所有保留和非法字符。 WebUtility.UrlEncode 在定义和实现方面都更加模糊。奇怪的是,它编码了一些保留字符而不是其他字符(为什么括号而不是括号?),而且陌生人仍然编码那个天真无保留的~
字符。
因此,我同意流行的建议 - 尽可能使用 Uri.EscapeDataString ,并了解像/
和?
这样的保留字符会被编码。如果您需要处理可能较大的字符串,尤其是URL编码的表单内容,则需要依靠 WebUtility.UrlEncode 并接受其怪癖,或以其他方式解决问题。 / p>
编辑:我attempted通过Url.Encode
,Url.EncodeIllegalCharacters
和{Flurl来纠正上述{3}}中提到的所有怪癖{1}}静态方法。它们位于core package(很小,不包括所有HTTP内容),或者可以随意从源代码中删除它们。我欢迎你对这些提出任何意见/反馈。
以下是我用来发现哪些字符编码方式不同的代码:
Url.Decode
答案 3 :(得分:26)
请记住,您可能不应该使用其中任何一种方法。 Microsoft的Anti-Cross Site Scripting Library包含HttpUtility.UrlEncode
和HttpUtility.HtmlEncode
的替换,这些替换更符合标准,更安全。作为奖励,您也可以获得JavaScriptEncode
方法。
答案 4 :(得分:10)
Server.UrlEncode()用于向后兼容Classic ASP,
Server.UrlEncode(str);
相当于:
HttpUtility.UrlEncode(str, Response.ContentEncoding);
答案 5 :(得分:4)
同样,Server.UrlEncode()
来电HttpUtility.UrlEncode()