From: "Martin J. Dürst" Date: 2009-09-09T20:11:56+09:00 Subject: [ruby-dev:39275] Re: Is URI.decode() broken? On 2009/09/08 13:59, Tanaka Akira wrote: > In article<20090908093235.0CC3.A69D9226@jp.fujitsu.com>, > KOSAKI Motohiro writes: > >>> decodeURI は、encodeURI が生成する %-encoding はすべて解きま >>> すが、そうでない %-encoding を一部解かないことがあるようです >>> が、これは何の役に立つのかなぁ? >>> (例えば、decodeURI("%40") が "%40" になるとか。) >> ちょっとついていけなかったので保留。 >> (たぶん、ruby特有の話なんだと推測) > > いや、JavaScript です。 > > % js > js> decodeURI("%40") > %40 > js> decodeURI("%41") > A > js> decodeURI("%25") > % 一般の文字 (unreserved, a-zA-Z0-9など) はエスケープしてもしなくても同じ のはず。したがって %41 -> A はいつでも可能です。URI の文法内に意味をなす 文字 (delimiters) はエスケープされたものとエスケープされてないものでは意 味が違いますので、いつでも変換できるとは限られません。たとえば http://example.com/abc#def と http://example.com/abc%23def は根本的に違 います。前者では #def は fragment で、後者では abc#def という path (ファ イルまただディレクトリなど) である。無差別に %23 -> # をするのは間違いで ある。decode でもどの部分を decode するによっていろいろ違ってくる。 以前ちょっと考えたのはその辺を第二の引数で指定できるようなメソッドでし た。引数には「これだけは decode しないで」、「(delimiter/reserved の内) これだけは decode して」、「この部分用なので、適当にやってくれ」という三 種類を考えたが、どちらの方がいいのか結論は出してないです。encode の方で は同様なことが考えられる。ある意味では JavaScript の encodeURI と encodeURIComponent が、二つ目の引数が与えられる選択肢の幅の両端に当たる かもしれません。 少し例を挙げますと、 encode系: 'abc#def', :path -> abc%23def # path 内には # はそのまま使えない 'abc#def', :fragment -> 'abc#def' 又は 'abc%23def' # fragment 内では # も %23 も同様 'abc#def', :uri -> 'abc#def' # URI 全体では # は fragment 前の区切りなの で、%23 はだめ それ以上考えるのは今日は残念ながら遅すぎます。 もうひとつ、URI::Generic.build など先ほどみたときに考えた。引数の数がや たら多く、多くの場合、固定の部分がかなりあるのではないかと思いました。そ ういうことを考えると例えば URI::Generic.build 'http://www.google.com/search', query: '2+3' で http://www.google.com/search?q=2%2B3 を作ってもらえるのでしたら、 URI::Generic.build 'http', '', 'www.google.com', '', '', 'search', '', '2+3', '' よりかなり便利のではないでしょうか。 よろしくお願いします。 Martin. -- #-# Martin J. Dürst, Professor, Aoyama Gakuin University #-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp