Man*_*anu 173 .net asp.net urlencode
Server.UrlEncode和HttpUtility.UrlEncode之间有区别吗?
Eam*_*nne 258
我之前对这些方法感到非常头疼,我建议你避免使用任何变体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
Run Code Online (Sandbox Code Playgroud)
但我个人最喜欢的必须是HttpUtility.UrlPathEncode - 这件事真是难以理解.它编码:
它还具有可爱的MSDN文档"对URL字符串的路径部分进行编码,以便从Web服务器向客户端进行可靠的HTTP传输". - 没有实际解释它的作用.你不太可能用Uzi射击自己的脚...
简而言之,坚持使用Uri.EscapeDataString.
Meh*_*ari 132
HttpServerUtility.UrlEncode
将在HttpUtility.UrlEncode
内部使用.没有具体的区别.存在的原因Server.UrlEncode
是与经典ASP的兼容性.
Tod*_*ier 51
快进这个问题已经快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
抛出UriFormatException
超过65,520个字符的字符串; WebUtility.UrlEncode
才不是.(比您想象的更常见的问题,特别是在处理URL编码的表单数据时.)Uri.EscapeDataString
抛出一个UriFormatException
在高代理字符 ; WebUtility.UrlEncode
才不是.(这是一个UTF-16的东西,可能不太常见.)对于URL编码目的,字符符合以下三个类别之一:未保留(URL中合法); 保留(合法但具有特殊含义,因此您可能希望对其进行编码); 和其他一切(必须始终编码).
根据RFC,保留字符是::/?#[]@!$&'()*+,;=
并且未保留的字符是字母数字和 -._~
Uri.EscapeDataString明确定义了它的任务:% - 编码所有保留和非法字符.WebUtility.UrlEncode在定义和实现方面都更加模糊.奇怪的是,它编码了一些保留字符而不是其他字符(为什么括号而不是括号?),而且陌生人仍然编码那个无辜无保留的~
字符.
因此,我同意流行的建议 - 尽可能使用Uri.EscapeDataString,并了解保留字符/
和?
将被编码.如果您需要处理可能较大的字符串,尤其是URL编码的表单内容,则需要依赖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}");
Run Code Online (Sandbox Code Playgroud)
CMS*_*CMS 11
Server.UrlEncode()用于向后兼容Classic ASP,
Server.UrlEncode(str);
Run Code Online (Sandbox Code Playgroud)
相当于:
HttpUtility.UrlEncode(str, Response.ContentEncoding);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
136132 次 |
最近记录: |