.NET UrlEncode不起作用

本文关键字:不起作用 UrlEncode NET | 更新日期: 2023-09-27 17:57:09

根据 http://www.w3schools.com/tags/ref_urlencode.asp提交请求时,它们被 URL 编码,因此例如空格被转换为 %20。目前为止,一切都好。

我有问题!在表单中提交会按预期将其转换为 %21。然而,HttpUtility.UrlEncode(或其WebUtility合作伙伴)或Uri.EscapeDataString都会回来!这是预期的行为吗?我应该如何对来自 c# 的输入进行编码,以便它转换正确的值?

.NET UrlEncode不起作用

叹号被视为 URL 安全的 ASCII 字符,因此不进行百分比编码。

来自 MSDN

UrlEncode 方法 URL 对不在集合中的任何字符进行编码 被认为是 URL 安全的 ASCII 字符。空格是 编码为 ASCII"+"字符。URL 安全的 ASCII 字符包括 ASCI 字符(A 到 Z 和 a 到 z)、数字(0 到 9)和一些 标点符号。下表列出了标点符号 被视为 URL 安全的 ASCII 字符。

该表包含- _ . ! * ( )

更新

根据这个答案,Uri.EscapeDataString在针对 .NET 4.5 项目时应该对!进行编码,但我无法在当前的机器上对其进行测试。 以前的 .NET 框架上的EscapeDataString不会对上述字符进行百分比编码。您可能只需要使用 String.Replace 并从转义的 URI 中替换上述字符。

因此,我们有一些字符位于"灰色"区域,可以但不必编码。

所有字符都可以编码。 http://stackoverflow.com/questionshttp://stackoverflow.com/%71%75%65%73%74%69%6F%6E%73都是相同的。

唯一无法对字符进行编码的情况是,如果它以对 URI 具有特殊含义的方式使用,例如分隔路径元素的/

只有在以下情况下,必须对字符进行编码:

  1. 它是那些特殊含义的字符之一,而不是与该特殊含义一起使用。
  2. 它是在特定 URI 方案或特定位置中可能具有特殊含义的保留字符之一。
  3. 它有一个关于 U+007F 的代码点。

不过,最后两个也有例外。

在第三种情况下,如果您使用 IRI,则不会对此类字符进行编码,这几乎是 IRI 的定义。您可以通过执行或撤消该编码在 IRI 和 URI 之间进行转换。(主机部分中的任何此类字符都必须进行 punycode 编码,而不是 URI 编码)。

在第二种情况下,如果不在相关上下文中用作分隔符,则不对字符进行编码是安全的。例如,&可以保留在某些 URI 中,但不能保留在 HTTP URI 中,因为它通常用作查询数据的分隔符。这取决于对特定 URI 方案有特定的了解。这可能也不值得冒其他过程没有意识到没关系的风险。

!就是一个例子。RFC 3986 包括生产:

reserved    = gen-delims / sub-delims
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="

因此,!在一组字符中,根据所使用的方案,可以安全地保留未编码或不编码。

一般来说,如果你正在编写自己的编码代码(例如在编写HttpEncoder实现时),你可能最好总是编码!,但如果你使用的编码器不是一直编码!,那可能也没问题;当然,在HTTP URI中,它不应该有任何区别。