如何强制使用%20而不是+在System.Net.WebUtility.UrlEncode中

29

我需要在一个类库程序集中对URL进行编码,但不想引用System.Web。该URL包含多个空格。

https://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quote where  symbol in ("YHOO","AAPL")&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

当我使用System.Net.WebUtility.UrlEncode()方法时,空格会被替换为"+",但这种方式不起作用。我需要将它们替换为"%20"。

如何在不引用System.Web的情况下实现这一点?


5
为什么"+"不能正常工作?任何能够正确解释URL编码的代码都应该以相同的方式解释"+"和"%20"。 - Eric J.
https://dev59.com/I3I-5IYBdhLWcg3w3crS在URL中,空格字符可以使用“+”或“%20”进行编码。这两种方法都是有效的,但是在不同的情况下可能会有所不同。例如,在查询字符串中,使用“+”更为常见,而在路径中使用“%20”更为常见。https://dev59.com/vnE85IYBdhLWcg3wpFKu在大多数情况下,将空格编码为“+”或“%20”没有区别。但是,在某些情况下,如在HTML表单数据中,应该使用“+”,因为它更符合标准。在其他情况下,如在URL路径中,应该使用“%20”。 - stuartd
Yahoo Finance查询语言不将“+”解释为等同于空格(%20)。我已尝试手动使用两种方式和“+”,但它并没有起作用。 - ChrisP
1
您所提供的URL返回一个有效的JSON响应,其中包含+、%20或空格。 - stuartd
2
@sturatd - JSON只是UrlEncoding使用的一小部分。我正在尝试创建一个mailto标签,可以提供主题行和正文。WebUtility.UrlEncode创建了一个带+号而不是%20的URL,因此我的邮件程序会显示加号。它不会显示%20。Uri.EscapeUriString无法正确转义正斜杠。OP的问题非常重要,但还没有得到解答。 - barrypicker
3个回答

24

你可以尝试使用System程序集中的Uri.EscapeUriString函数,它会对URI字符串进行转义处理。对于来自问题的字符串,该函数返回:

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quote%20where%20%20symbol%20in%20(%22YHOO%22,%22AAPL%22)&format=json&diagnostics=true&env=store%253A%252F%252Fdatatables.org%252Falltableswithkeys&callback=

9

Uri.EscapeDataString() 更适合你的目的,因为 Uri.EscapeUriString() 可能会跳过一些特殊字符。


0

只要你在 Web 应用程序中或者不介意包含 System.Web 依赖项,HttpUtility.ParseQueryString 就可以工作。另一种方法是:

NameValueCollection queryParameters = new NameValueCollection();
string[] querySegments = queryString.Split('&');
foreach(string segment in querySegments)
{
   string[] parts = segment.Split('=');
   if (parts.Length > 0)
   {
      string key = parts[0].Trim(new char[] { '?', ' ' });
      string val = parts[1].Trim();

      queryParameters.Add(key, val);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接