URI.decode_www_form は、引数の先頭にある ? を無視します。 % ./ruby -ruri -ve 'p URI.decode_www_form("?a=b")' ruby 1.9.2dev (2010-04-08 trunk 27262) [i686-linux] [["a", "b"]] % ./ruby -ruri -ve 'p URI.decode_www_form("a=b")' ruby 1.9.2dev (2010-04-08 trunk 27262) [i686-linux] [["a", "b"]] 意図は分かるんですが、残念なことに、URI の query には ? という文字を 入れられます。 RFC 3986: query = *( pchar / "/" / "?" ) そのため、? で始まる key もちゃんと扱うにはどうするのか明瞭ではありません。 ここは ? の特別扱いをあきらめたほうがいいんじゃないでしょうか。 あと、その unless /\A\??(?<query>[^=;&]*=[^;&]*(?:[;&][^=;&]*=[^;&]*)*)\z/ =~ str というところで、[^;&]* というパターンが使われていて、 正しい application/x-www-form-urlencoded であることを検査していません。 ちゃんと検査したほうがいい気がするんですがどうでしょうか。 % ./ruby -ruri -e 'p URI.decode_www_form("%=%")' [["%", "%"]] -- [田中 哲][たなか あきら][Tanaka Akira]