2

解析クエリ文字列が必要です:?artist=singer1 & singer2&song=name song

値に「singer1&singer2」のようなアンパサンドが含まれている場合、静的メソッドHttpUtility.ParseQueryStringは希望どおりに機能しません。

例えば:

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

結果は次のとおりです。

  1. アーティスト=歌手1
  2. null = singer2
  3. 歌=名前の歌

結果が欲しい

artist = singer 1 & singer2
song = name song

何か案が?

4

3 に答える 3

15

&値の 1 つの途中にあるアンパサンド ( ) は、予約済みのシンボルであるため、パーサーからスローされています。代わりに数値コードに置き換えます。

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

あなたの問題は&、クエリ文字列で特別な意味を持つことです。つまり、引数を分離することです。知覚されたパラメータの&真ん中は、実際には引数セパレータとして解析されています。URL を構成するときに URL エンコードする必要があります。artist&

たとえば、1 つの正しいクエリ文字列は次のようになります。

?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をエスケープまたはエンコードする必要があります。&

fred & blotts たとえば、結果のクエリ文字列がでは&q=fred+%26+blottsなく含まれていることについてGoogleに尋ねた場合&q=fred+&+blotts

https://www.rfc-editor.org/rfc/rfc3986#page-12を参照してください

于 2013-03-22T14:30:53.570 に答える