- PR -

Request.QueryString で%が消える

1
投稿者投稿内容
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 2009-02-25 23:24
いつもお世話になっております。
VS2003でASP.NETアプリを触っております。

画面遷移時における遷移先アドレスの、クエリ文字列部分の暗号化の仕組みを考えました。
例えば、本来
xxxx.aspx?userid=0001&pageid=10
となる部分を、暗号化することで
xxxx.aspx?query=f9r385ud8wi9ei30e9ie93i
のように、useridやpageidといった複数の項目の情報がqueryという
1つのQueryStringアイテムに暗号化して詰め込めたら良いな、と考えました。

そこで、新たなクラスを作り、
(1)項目名と値に関しては、半角1文字に対して英数2文字に変換する。
(2)& や = といった元のクエリ文字列におけるセパレータは、半角1文字に置き換える。 
という機能を盛り込みました。

で、やっと本題なのですが、(2)において試行錯誤していた中で、% や + を変換後の
文字列にすると、> に化けたり、半角のブランクになったりしました。
%に関して言えば、= の代わりに使うと化けるのに、& に使った場合はちゃんと表示され
ます。

いずれの場合も、暗号化直後はちゃんと表示されているのに、遷移先で
Request.QueryString("query") で取ってきた段階で化けています。

他の文字で置き換えれば済む話なので、特別困っているわけでもないのですが、
気になったので質問させていただきました。どうしてこのような現象になるのか、
ご存知の方がいらっしゃいましたらお教えください。よろしくお願いします。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2009-02-25 23:30
URLにおける、%や+の役割を調べて下さい。
http://ja.wikipedia.org/wiki/URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 2009-02-26 16:43
Azulean様
ご回答いただきありがとうございます。

URIには+や%が使えない、とありますね。そう言われれば、なるほど、そうなのねぇ、
と今さらながらに納得しております。恥ずかしい話ですが。

でも、Encode後の文字列には使えるんですよね。となると、そもそもEncodeとは
何ぞや?ってところから掘り下げないといけないので、これから調べます。

ありがとうございました。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2009-02-26 23:29
URLに含めたい文字があっても、URLで使えない文字があるとします。
その文字を特定のルールで変換して、URLで使える文字で表現することをエンコード(符号化)と言います。

URLのエンコードでは、半角スペースを+に、特殊な意味を持つ%と+と&と=等とURLに使えない文字を%aa というように%と16進数で置き換えます。
※+は半角スペースを意味するため、&や=は区切りを意味するため、%はそれに続く2文字で1バイトを意味するため。

%aa(%と16進数)で1バイトを表すというのが一般的なルールであるため、QueryStringではエンコードの逆、デコードをすることで、%aa は 元の1バイトに、+は半角スペースに復元されます。

この動作を知らないと、確かに文字化けしたと思うかもしれませんね。
1

スキルアップ/キャリアアップ(JOB@IT)