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  <naruse / airemix.jp>