クエリ文字列を扱うときにDictionary
HttpUtility.ParseQueryStringメソッドを使う
HttpUtility.ParseQueryStringメソッドはクエリ文字列を引数に、NameValueCollectionオブジェクトを返します。NameValueCollectionは、Dictionary
HttpUtility.ParseQueryStringメソッドが返すNameValueCollectionは、ToStringメソッドで、&と=でつなげたクエリ文字列がそのまま返ります。部分的に値を変更して改めてクエリ文字をつくるような操作もお手の物です。
サンプルコード
// using System.Web;
// using System.Collections.Specialized
// ダミーのURLです
string url = "http://www.hogehoge.co.jp/index.htm?var1=%u3042%u3044%u3046%u3048%u304a&var2=abc&var3=12345";
Uri uri = new Uri(url);
string queryString = uri.Query;
Console.WriteLine(queryString);
// ?var1=%25u3042%25u3044%25u3046%25u3048%25u304a&var2=abc&var3=12345
// ①クエリ文字列からNameValueCollectionを生成
NameValueCollection query = HttpUtility.ParseQueryString(queryString,Encoding.UTF8);
// ②クエリの値を確認
foreach(string key in query.Keys){
Console.WriteLine(key + "=" + HttpUtility.UrlDecode(query[key]));
}
// var1=あいうえお
// var2=abc
// var3=12345
// ③クエリの値を変更
query["var1"] = "かきくけこ";
// ④クエリ文字列を再生成
Console.WriteLine(query.ToString());
// var1=%u304b%u304d%u304f%u3051%u3053&var2=abc&var3=12345
コードの解説
①クエリ文字列からNameValueCollectionを生成ダミーURLをもとに、HttpUtility.ParseQueryStringメソッドを使用してクエリ文字列からNameValueCollectionを生成します。
②クエリの値を確認
NameValueCollectionオブジェクトに値がどのように格納されているかクエリの値を確認します。
③クエリの値を変更
キー(var1)に対応するクエリの値を変更します。
④クエリ文字を再生成
NameValueCollectionオブジェクトのToStringメソッドを呼び出すと、=と&で結合されたクエリ文字列が生成されます。
※
NameValueCollectionはSystem.Collections.Specializedというあまり聞きなれない名前空間にあります。
HttpUtility.ParseQueryStringメソッドのために、using System.Web;が必要です。(要System.Web.dll参照)
NameValueCollectionをDictionaryに変換する
NameValueCollectionはDictionaryに似ているのですが、Linqが使えません。何かとDictionary形式のほうが使い勝手がいいとお考えの人は、変換してあげてください。
Dictionary<string,string> dic = query.Keys.Cast<string>().ToDictionary(n => n, m => query[m]);
それではよきクエリ文字ライフを!
教えてください."%u3042%u3044%u3046%u3048%u304a"というようなパーセントエンコーディングの規約はどのRFCで規定されているのでしょうか??通常はRFC3986の"2.1. Percent-Encoding"で、'pct-encoded = "%" HEXDIG HEXDIG' とされているので、そちらの記法が一般的と思っていました.
返信削除