Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Server.UrlEncode与HttpUtility.UrlEncode_Asp.net_.net_Urlencode - Fatal编程技术网

Asp.net 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

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

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”(注意与前面转义序列的差异!)
它还有Lovelly特定的MSDN文档“对URL字符串的路径部分进行编码,以便从Web服务器到客户端进行可靠的HTTP传输。”——但没有实际解释它的功能。你不太可能用乌兹枪射自己的脚


简言之,坚持

这一问题提出至今已有近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
    不存在
  • Uri.EscapeDataString
    对长度超过65520个字符的字符串抛出
    UriFormatException
    WebUtility.UrlEncode
    没有。()
  • Uri.EscapeDataString
    在上抛出一个
    UriFormatException
    WebUtility.UrlEncode
    没有。(这是UTF-16,可能不太常见。)
出于URL编码的目的,字符可分为三类:无保留(URL中的合法字符);保留(在中是合法的,但具有特殊含义,因此您可能需要对其进行编码);以及其他所有内容(必须始终进行编码)

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

不保留的字符是字母数字和
-。\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