HttpServerUtility.UrlPathEncode vs HttpServerUtility.UrlEncode

Wil*_*lka 22 asp.net

HttpServerUtility.UrlPathEncode和之间有什么区别HttpServerUtility.UrlEncode?什么时候我应该选择另一个?

Sco*_*ord 26

UrlEncode对查询字符串值很有用(所以在每个=的左侧或特别是右侧).

在这个网址中,foo,fooval,barbarval应该是每个单独的UrlEncode:

http://www.example.com/whatever?foo=fooval&bar=barval

UrlEncode将所有内容(例如?,&,=和/,重音符号或其他非ASCII字符等)编码为%-style编码,但编码为+的空格除外.这是表单样式编码,最适合您打算放入查询字符串(或者可能在网址中的两个斜杠之间)作为参数,而不会使用url的控制字符(如&)获取所有jiggy.否则,不幸的是,在用户的表单输入或db值中放置&或=可能会破坏事物.

编辑:Uri.EscapeDataString是与UrlEncode非常接近的匹配,可能更好,但我不知道确切的差异.

UrlPathEncode对查询字符串的其余部分很有用,它会影响到左边的所有内容.

在此网址中,整个网址(从http到barval)应该通过UrlPathEncode运行.

http://www.example.com/whatever?foo=fooval&bar=barval

UrlPathEncode不编码?,&,=或/.但是,它与UrlEncode一样,使用%表示法编码带重音/非ASCII字符,空格也变为%20.这对于确保url有效非常有用,因为空格和重音字符不是.它不会触及您的查询字符串(右边的所有内容?),因此您必须使用上面的UrlEncode对其进行编码.

  • UrlPathEncode本质上是错误的; 它不可能正常工作.考虑网址`http://example.com/really?-unexpected-truths?id=3&user=eamon&co`意图是第一个问号是网址的一部分,第二个问号是uri查询的分隔符组件,但没有办法知道.并且意图是第一个`&`成为分隔符,第二个是内容......但是再一次,没有办法知道.*编码的整点*是数据可能包含底层格式使用的特殊控制字符,因此您不能*以这种方式编码. (2认同)
  • “UrlEncode”只是“EscapeDataString”的一个温和的非标准遗留版本。用它来代替;如果您希望生成的 uri 具有可靠的可移植性,请不要使用“UrlEncode”。 (2认同)
  • @EamonNerbonne:我认为你的TL; DR是危险的误导.读完背景,它说,"根本不需要编码." 我认识到你指的是使用`EscapeDataString`,并且它应该以分段的方式用于你不打算包含控制字符的URL的任何部分,但是TL; DR甚至不暗示在任何一个. (2认同)

Art*_*miy 18

更新:从4.5开始,根据MSDN参考,Microsoft建议仅使用UrlEncode.此外,MSDN中先前列出的信息并未完全描述这两种方法的行为 - 请参阅注释.

区别在于空间转义 - UrlEncode将它们转换为+符号,UrlPathEncode转义为%20.如果它们是每个W3C的QueryString部分的一部分,则+和%20仅相等.所以你不能使用+符号来逃避整个URL,只能使用查询字符串部分.底线是UrlPathEncode永远是更好的imho

您可以使用UrlEncode()方法或UrlPathEncode()方法对URL进行编码.但是,这些方法会返回不同的结果.UrlEncode()方法将每个空格字符转换为加号字符(+).UrlPathEncode()方法将每个空格字符转换为字符串"%20",表示十六进制表示法的空格.在对URL的路径部分进行编码时,请使用UrlPathEncode()方法,以保证解码的URL一致,无论哪个平台或浏览器执行解码.

http://msdn.microsoft.com/en-us/library/4fkewx0t.aspx

  • 实际上存在的差异不仅仅是空间的处理,尽管文档并没有真正说明这一点.UrlEncode会编码"?"之类的字符 和"&"被UrlPathEncode忽略.请看:http://connect.microsoft.com/VisualStudio/feedback/details/551839/error-in-documentation-for-httpserverutility-urlpathencode (19认同)
  • 在第一次出现"?"后,UrlPathEncode也没有编码任何内容.它假定其余的是查询字符串,并假定查询字符串已经编码. (8认同)
  • 值得注意的是,用于`UrlPathEncode`的.NET 4.5版文档声明:"不要使用;仅用于浏览器兼容性.请使用`UrlEncode`." http://msdn.microsoft.com/en-us/library/system.web.httputility.urlpathencode.aspx这对于'HttpUtility.UrlPathEncode`和`HttpServerUtility.UrlPathEncode`都是如此. (3认同)
  • HttpUtility.UrlPathEncode("http://your.URI.here") + "?" + HttpUtility.UrlEncode("name1") + "=" + HttpUtility.UrlEncode("value1") + "&" + HttpUtility.UrlEncode("name2") + "=" + HttpUtility.UrlEncode("value2") + " #" + HttpUtility.UrlPathEncode("锚点") (2认同)