From: "NARUSE, Yui" Date: 2009-09-09T19:51:08+09:00 Subject: [ruby-dev:39274] Re: Is URI.decode() broken? Tanaka Akira wrote: > encodeURI("@") は "@" なので、encodeURI は %40 を生成しない > んですよねぇ。 > > js> encodeURI("@") > @ > > だから、%40 があるとしたら、それは encodeURI 以外から来たも > のであるはずです。そうすると、それはどういう状況なのかなぁ、 > という疑問なんですが。 userinfo に含まれる、ユーザ名やパスワードに @ が含まれていたので、 IRI っぽいものにされた段階でエスケープされたのではないでしょうか。 >>> encodeURIComponent は基本的な考え方としては悪くないと思いま >>> す。! などがそのままなのは甘いと思いますが、古い RFC の影響 >>> でしょうね。今だったら unreserved 以外を一律に %-encoding に >>> してしまうのがいいでしょう。 >> HTML5 の 4.10.16.4 URL-encoded form data を見ると、 >> それに近い動きを言っていますね。 >> http://www.whatwg.org/specs/web-apps/current-work/#application/x-www-form-urlencoded-encoding-algorithm >> SP を + に置換してたりはしますが。 > > これはこれで謎だなぁ。 > reserved のひとつである * はそのままにするのに > unreserved のひとつである ~ は %7E にするという理由は理解で > きません。 > > あと、U+0041 LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL > LETTER Z representing the hexadecimal value というのは間違い > でしょうな。16進の終わりは Z じゃなくて F でしょう。 この辺に関しては(聞いて|指摘して)みます。 >>> あるいは、URI.escape_html_form([[k1, v1], [k2, v2], ...]) と >>> いうメソッドが、application/x-www-form-urlencoded に従って >>> (エスケープして) k1=v1&k2=v2&... という形式を生成するメソッ >>> ドだとすると、k, v の中では、query に使えない文字と =,& を >>> エスケープすることになります。(あと + と ; もかな) >> これも必要だとは思うのですが、 >> 名前は www_form_urlencode の方がよくありませんか。 >> www_ は取ってもいいかもしれませんが。 > > html という語を入れたのは URI の世界から見ると HTML でない > form もあり得る、という意図です。(-1) application/x-www-form-urlencoded は HTML だけでなく、 WSDL や XForms からも参照され、cookie でも時々利用されるので、 HTML と指定するのはちょっとひっかかります。 また、HTML と付けることで何かこれの仕様をより厳密にできるかというと、 HTML5 以外は記述が少なすぎる上にそれぞれ異なるどころか、 HTML 4 では ASCII 文字限定だったりするので、これまた HTML と指定する意義はないように感じます。 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 http://suika.fam.cx/~wakaba/wiki/sw/n/application+x-www-form-urlencoded HTML5 まで限定すると、HTML5 の The appropriate form encoding algorithm のうち、URI に突っ込むことを意図したものは、 4.10.16.4 URL-encoded form data しかないので特定可能ですけれど。 -- NARUSE, Yui