.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# 的输入进行编码,以便它转换正确的值?
叹号被视为 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/questions
和http://stackoverflow.com/%71%75%65%73%74%69%6F%6E%73
都是相同的。
唯一无法对字符进行编码的情况是,如果它以对 URI 具有特殊含义的方式使用,例如分隔路径元素的/
。
只有在以下情况下,必须对字符进行编码:
- 它是那些特殊含义的字符之一,而不是与该特殊含义一起使用。
- 它是在特定 URI 方案或特定位置中可能具有特殊含义的保留字符之一。
- 它有一个关于 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中,它不应该有任何区别。