Server.UrlEncode和HttpUtility.UrlEncode有什么区别吗?
发布于 2009-03-02 15:03:07
HttpServerUtility.UrlEncode将在内部使用HttpUtility.UrlEncode。没有具体的区别。Server.UrlEncode之所以存在,是因为它与传统的ASP.
发布于 2017-12-19 06:49:03
快进到9年前,这个问题首次被提出,在URL和.NET标准的世界中,我们最常见的网址编码选项是WebUtility.UrlEncode (在System.Net下)和Uri.EscapeDataString.从这里和其他地方最流行的答案来看,Uri.EscapeDataString似乎更可取。但这是真的吗?我做了一些分析,以了解其中的差异,以下是我得出的结论:
WebUtility.UrlEncode将空格编码为代码;代码将其编码为%20.Uri.EscapeDataString percent编码!、(、)和*;WebUtility.UrlEncode执行not.Uri.EscapeDataString percent编码代码;Uri.EscapeDataString对超过65,520个字符的字符串抛出<+>D29Uri.EscapeDataString >;<WebUtility.UrlEncode>D30~>不抛出。(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编码而言,字符属于以下三种类别之一:非保留(URL中的合法);保留(在中合法,但具有特殊含义,因此您可能希望对其进行编码);以及其他所有内容(必须始终进行编码)。
根据RFC,保留字符为::/?#[]@!$&'()*+,;=
非保留字符是字母数字和-._~
判决结果
Uri.EscapeDataString明确定义了它的任务:%-对所有保留和非法字符进行编码。WebUtility.UrlEncode在定义和实现上都比较模糊。奇怪的是,它只编码一些保留字符,而不编码其他保留字符(为什么是圆括号而不是方括号?),更奇怪的是,它编码的是非保留的~字符。
因此,我同意流行的建议-尽可能使用Uri.EscapeDataString,并理解将对保留字符进行编码,如/和?。如果您需要处理可能很大的字符串,特别是使用URL编码的表单内容,那么您需要使用WebUtility.UrlEncode并接受它的怪癖,或者以其他方式解决这个问题。
编辑:我已经通过Url.Encode、Url.EncodeIllegalCharacters和Url.Decode静态方法在Flurl中纠正了上面提到的所有怪癖。这些都在core package中(它很小,并不包含所有的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}");发布于 2009-03-02 20:56:49
记住,您可能不应该使用这两种方法中的任何一种。微软的Anti-Cross Site Scripting Library包括HttpUtility.UrlEncode和HttpUtility.HtmlEncode的替代品,它们都更符合标准,也更安全。作为额外的奖励,您还可以获得一个JavaScriptEncode方法。
https://stackoverflow.com/questions/602642
复制相似问题