根据urlencode.asp,当请求被提交时,它们是被URL编码的,例如,空间被转换为%20。
我对此有意见!在表单中提交它将按其应有的方式将其转换为%21。然而,HttpUtility.UrlEncode (或其WebUtility合作伙伴)或Uri.EscapeDataString都将返回!这是否一种预期的行为?我应该如何从c#对输入进行编码,以便它能够转换正确的值?
发布于 2015-06-19 08:04:00
感叹号被认为是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框架中的.NET不对上面的字符进行百分比编码。您可能只需使用String.Replace并替换转义URI中的上述字符。
发布于 2015-06-19 10:03:12
因此,我们有一些字符是在“灰色”区域,可以是,但不需要被编码。
所有字符都可以编码。http://stackoverflow.com/questions和http://stackoverflow.com/%71%75%65%73%74%69%6F%6E%73都是相同的。
唯一不能对字符进行编码的情况是,如果它是以一种在URI中具有特殊意义的方式使用的,例如/分离路径元素。
必须对字符进行编码的唯一时间,如果:
不过,最后两种情况也有例外。
在第三种情况下,如果使用IRI,则不对这些字符进行编码,这基本上就是IRI的定义。您可以通过执行或取消该编码在IRI和URI之间进行转换。(主机部分中的任何这样的字符都必须编码,而不是URI编码)。
在第二种情况下,如果字符在所述上下文中不用作分隔符,则不对其进行编码是安全的。例如,&可以保留在某些URI中,但不能放在HTTP中,因为HTTP经常用作查询数据的分隔符。不过,这取决于对特定URI方案的特定知识。这也可能是不值得冒险的一些其他过程,没有意识到它是好的。
!就是一个例子。RFC 3986包括生产:
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="因此,!在一组字符中,可以安全地保留未编码或不编码,这取决于所使用的方案。
通常,如果您正在编写自己的编码代码(例如编写HttpEncoder实现时),那么最好始终对!进行编码,但是如果您使用的编码器并不总是对!进行编码,这也是可以的;当然,在HTTP中,这不会有任何区别。
https://stackoverflow.com/questions/30932903
复制相似问题