根据http://www.w3schools.com/tags/ref_urlencode.asp,当请求被提交时,它们被URL编码,因此例如空间被转换为%20。到目前为止一切顺利。
我有一个问题!。在表单中提交它会将其转换为%21。但是,HttpUtility.UrlEncode
(或其WebUtility
合作伙伴)或Uri.EscapeDataString
都将返回!这是预期的行为吗?我应该如何对C#的输入进行编码,以便它转换为正确的值?
根据http://www.w3schools.com/tags/ref_urlencode.asp,当请求被提交时,它们被URL编码,因此例如空间被转换为%20。到目前为止一切顺利。
我有一个问题!。在表单中提交它会将其转换为%21。但是,HttpUtility.UrlEncode
(或其WebUtility
合作伙伴)或Uri.EscapeDataString
都将返回!这是预期的行为吗?我应该如何对C#的输入进行编码,以便它转换为正确的值?
2条答案
按热度按时间z6psavjg1#
感叹号被认为是URL安全的ASCII字符,因此不进行百分比编码。
从MSDN
UrlEncode方法对不属于被认为是URL安全的ASCII字符集的任何字符进行URL编码。空格编码为ASCII“+”字符。URL安全的ASCII字符包括ASCI字符(A到Z和a到z)、数字(0到9)和一些标点符号。下表列出了被视为URL安全ASCII字符的标点符号。
该表包含
- _ . ! * ( )
更新
根据this answer,
Uri.EscapeDataString
在定向时应编码!
。NET 4.5项目,但我无法在我目前的机器上测试它。EscapeDataString
上一页NET框架不对上述字符进行百分比编码。您可能只需要使用String.Replace
并替换转义URI中的上述字符。kxkpmulp2#
因此,我们有一些字符处于“灰色”区域,可以但不必进行编码。
所有字符 * 都可以 * 编码。
http://stackoverflow.com/questions
和http://stackoverflow.com/%71%75%65%73%74%69%6F%6E%73
都是相同的。唯一不能编码字符的情况是,如果它被以一种对URI有特殊意义的方式使用,例如
/
分隔路径元素。字符必须编码的唯一时间,如果:
1.它是那些特殊意义的字符之一,并且不与该特殊意义一起使用。
1.它是在特定URI方案或特定位置中可能具有特殊含义的保留字符之一。
1.它有一个关于U+007 F的代码点。
不过,最后两种情况也有例外。
在第三种情况下,如果你使用IRI,那么你就不会对这样的字符进行编码,这与IRI的定义非常相似。您可以通过执行或撤消该编码在IRI和URI之间进行转换。(主机部分中的任何这样的字符必须是punycode编码的,而不是URI编码的)。
在第二种情况下,如果字符在上下文中没有用作分隔符,则不对字符进行编码是安全的。例如,
&
在某些URI中可以保持原样,但在HTTP URI中则不行,因为它经常被用作查询数据的分隔符。然而,这取决于具有特定URI方案的特定知识。它也可能只是不值得其他一些过程没有意识到这是好的风险。!
就是这样一个例子。RFC 3986包括生产:因此
!
是在一组字符中,根据所使用的方案,可以安全地保留未编码或不编码。一般来说,如果你正在编写自己的编码代码(比如在编写
HttpEncoder
实现时),你可能最好总是编码!
,但如果你使用的编码器并不总是编码!
,这也可能是可以的;当然,在HTTP URI中,它不应该有任何区别。