2

我需要解析查询字符串:?artist=singer1 & singer2&song=name song

如果 value 包含像“singer1&singer2”这样的&符号,则静态方法HttpUtility.ParseQueryString无法按我想要的方式工作。

例如:

string qs = "?artist=singer1 & singer2&song=name song"; 
NameValueCollection query = HttpUtility.ParseQueryString(qs);

结果是:

  1. 艺术家=歌手1
  2. 空=歌手2
  3. 歌曲=名字歌曲

我想要结果

artist = singer 1 & singer2
song = name song

任何的想法?

4

3 回答 3

15

您的一个值中间的与号( &) 正在抛弃解析器,因为它是一个保留符号。用它的数字代码代替它:

string qs = "?artist=singer1+%26+singer2&song=name song"; 
NameValueCollection query = HttpUtility.ParseQueryString(qs);
于 2013-03-22T14:26:50.003 回答
6

您的问题是&在查询字符串中具有特殊含义,即分隔参数。在您感知的参数&中间实际上被解析为参数分隔符。构建 URL 时需要对 URL 进行编码。artist&

例如,一个正确的查询字符串是:

?artist=singer1+%26+singer2&song=name+song

(空格通常可以编码为+%20,但这是另一个讨论的主题。)

您可以HttpUtility.UrlEncode()在构建查询字符串组件时使用,以确保正确转义结果。例如,您可以像这样构建查询字符串:

static void Main()
{
    var values = new NameValueCollection();
    values["artist"] = "singer1 & singer2";
    values["song"] = "name song";

    Console.WriteLine(CreateQueryString(values));
}

static string CreateQueryString(NameValueCollection values)
{
    if (values == null) { throw new ArgumentNullException("values"); }

    return string.Join(
        "&",
        values.AllKeys.Select(key => HttpUtility.UrlEncode(key) + "=" +
                                     HttpUtility.UrlEncode(values[key]))
                      .ToArray());
}

换句话说,问题发生在您构建查询字符串时,而不是在您尝试解析它时。解析它时,您已经有一个语义不正确的查询字符串;此时您无能为力。

于 2013-03-22T14:26:35.837 回答
0

如果你想要艺术家 =singer1 & singer2你需要&在你的查询字符串中转义或编码。

例如,如果我向 Google 询问fred & blotts 结果查询字符串包含&q=fred+%26+blotts而不是&q=fred+&+blotts

https://www.rfc-editor.org/rfc/rfc3986#page-12

于 2013-03-22T14:30:53.570 回答