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

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

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

例如:

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

结果是:

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

我想结果

 artist = singer 1 & singer2 song = name song 

任何的想法?

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

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

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

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

 ?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()); } 

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

如果你想要artist = singer1 & singer2你需要在查询字符串中转义或编码&

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

见http://tools.ietf.org/html/rfc3986#page-12