Asp.net Server.UrlEncode与HttpUtility.UrlEncode
Server.UrlEncode和HttpUtility.UrlEncode之间有区别吗?Asp.net Server.UrlEncode与HttpUtility.UrlEncode,asp.net,.net,urlencode,Asp.net,.net,Urlencode,Server.UrlEncode和HttpUtility.UrlEncode之间有区别吗?HttpServerUtility.UrlEncode将在内部使用HttpUtility.UrlEncode。没有具体区别。存在Server.UrlEncode的原因是与经典ASP的兼容性。同样,Server.UrlEncode()调用HttpUtility.UrlEncode()服务器。UrlEncode()用于提供与经典ASP的向后兼容性 Server.UrlEncode(str); 相当于: Htt
HttpServerUtility.UrlEncode
将在内部使用HttpUtility.UrlEncode
。没有具体区别。存在Server.UrlEncode
的原因是与经典ASP的兼容性。同样,Server.UrlEncode()
调用HttpUtility.UrlEncode()
服务器。UrlEncode()用于提供与经典ASP的向后兼容性
Server.UrlEncode(str);
相当于:
HttpUtility.UrlEncode(str, Response.ContentEncoding);
请记住,您可能不应该使用这些方法中的任何一种。微软的产品包括对
HttpUtility.UrlEncode
和HttpUtility.HtmlEncode
的替代品,它们都更符合标准,也更安全。作为奖励,您还可以获得一个JavaScriptEncode
方法。我以前对这些方法感到非常头疼,我建议您避免使用任何UrlEncode
的变体,而改为使用——至少您的行为是可以理解的
让我们看看
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.urlpathcode,这真是让人难以理解。它编码:
- “”==>“%20”
- “100%true”==>“100%%20true”(好的,您的url现在已断开)
- “测试A.aspx#锚定B”==>“测试%20A.aspx#锚定%20B”
- “test A.aspx?hmm#anchor B”==>“test%20A.aspx?hmm#anchor B”(注意与前面转义序列的差异!)
简言之,坚持这一问题提出至今已有近9年,在.NET核心和.NET标准的世界中,我们对URL编码最常用的选项似乎是WebUtility.UrlEncode(在
System.NET
下)和Uri.EscapeDataString。从这里和其他地方最流行的答案来看,Uri.EscapeDataString似乎更可取。但是是吗?我做了一些分析以了解差异,以下是我得出的结论:
将空间编码为WebUtility.UrlEncode
+
将其编码为Uri.EscapeDataString
%20
百分比编码Uri.EscapeDataString
代码>,
,(
和)
*
没有WebUtility.UrlEncode
百分比编码WebUtility.UrlEncode
<代码>Uri。EscapeDataString不存在~
对长度超过65520个字符的字符串抛出Uri.EscapeDataString
UriFormatException
没有。()WebUtility.UrlEncode
在上抛出一个Uri.EscapeDataString
UriFormatException
没有。(这是UTF-16,可能不太常见。)WebUtility.UrlEncode
:/?#[]@!$&'()*+,;=代码>
不保留的字符是字母数字和-。\uz
判决书
Uri.EscapeDataString明确定义了它的任务:%-编码所有保留字符和非法字符WebUtility.UrlEncode在定义和实现上都更加模糊。奇怪的是,它编码的是一些保留字符,而不是其他字符(为什么是括号而不是括号??),更奇怪的是,它编码的是天真的未保留的~
字符
因此,我同意流行的建议-尽可能使用Uri.EscapeDataString,并理解像/
和?
这样的保留字符将被编码。如果您需要处理潜在的大字符串,特别是URL编码的表单内容,那么您需要求助于WebUtility.UrlEncode并接受它的怪癖,或者解决这个问题
编辑:我必须通过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}");
不幸的是,当对某些web服务器执行HTTP请求时,这仍然不起作用——Uri.EscapeDataString()不编码“!”或“”,这与大多数escape()的浏览器实现的工作方式不同。。。!和“字符不应该被编码;但是,如果有缺陷的Web服务器需要这样做,那么很容易解决。避免javascript的转义函数——它本身就有缺陷(例如,不可能往返)。见——但简而言之;您可以改为使用encodeUriComponent(),它的行为类似于EscapeDataString——它可预测且可逆地编码字符串,但也不编码!和“角色”。这是老问题,但问题被推到了头版,所以。。。。url字符串的路径部分是域和?或者#在一个url中。@Tim:可能有几个?
,谁能说哪些要编码,哪些用作分隔符?至于空间:在这两种情况下,空间都在散列中,因此查询片段的存在与否应该无关紧要。最后,破坏Uri是不可原谅的,如第二个示例中包含%的Uri。urlpath