如果值包含&符号,如何更正C#中的解析查询字符串?

mis*_*sak 2 c#

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

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

例如:

string qs = "?artist=singer1 & singer2&song=name song"; 
NameValueCollection query = HttpUtility.ParseQueryString(qs);
Run Code Online (Sandbox Code Playgroud)

结果是:

  1. artist = singer1
  2. null =歌手2
  3. 歌=名歌

我想结果

artist = singer 1 & singer2
song = name song
Run Code Online (Sandbox Code Playgroud)

任何的想法?

D S*_*ley 14

&其中一个值中间的&符号()放弃了解析器,因为它是一个保留符号.将其替换为数字代码:

string qs = "?artist=singer1+%26+singer2&song=name song"; 
NameValueCollection query = HttpUtility.ParseQueryString(qs);
Run Code Online (Sandbox Code Playgroud)


cdh*_*wie 6

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

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

?artist=singer1+%26+singer2&song=name+song
Run Code Online (Sandbox Code Playgroud)

(空格通常可以编码为+或%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());
}
Run Code Online (Sandbox Code Playgroud)

换句话说,问题出现在构建查询字符串时,而不是在您尝试解析它时.在解析它时,您已经有一个语义上不正确的查询字符串; 在这一点上你无能为力.