今日知ったこと2点。

encodeURIComponent の URIComponent って何

ECMAScript の escape() は Version3 では deprecated で、代わりに encodeURI() と encodeURIComponent() を使うようにものの本には書いてあります。でも僕が愚かなあまり違いがわかっていなかったんですが、今日わかりました。

encodeURI() は、URI 全体として有効な文字になるようにする。なので/:#といった URI のデリミタとして予約されている文字はエスケープされないし、もちろん_など、とにかく URI につかっても問題ない記号はエスケープされない(馬鹿っぽい結論ですみません)。

encodeURIComponent() は、URI Component として有効な文字になるようにする。でこの URI Component というのが、URIRFC にあるところの、Syntax Components のことみたい。

Syntax Components は次のとおり。

  • scheme(http、https…)
  • authority(usernameとhostとportで構成される部分、oogatta@oogatta.com、www.oogatta.com:8080、oogatta.com…)
  • path(/test/test.html)
  • query(key=value&key=value)
  • fragment(#から末尾までの hash 部分)

ということで、以上の Component としてふさわしい文字にエスケープされるのが encodeURIComponent()。だから、encodeURI() がエスケープしてくれなかった URI Component 間を区切る文字はエスケープする/とか#とか。

これまで知らなかった自分に猛省を促す。

ちなみに URI の仕様としては、エンコーディングに使う文字コードはなんでも良いらしい。あー、だから前はブラウザやらバージョンやらで違ったりしてたんですね…。なるほどー。

さらにちなみに escape()

deprecated の escape() 君ですが、彼が何していたかというと文字集合としての ASCII に含まれる文字・記号だけ残して、あとは全部 Unicode 文字集合にエスケープしちゃうっちゅーもんだったわけですね…(そのうち\u00??から\u00ffまでは縮めて%xxって形でエスケープされる)。エンコーディングとは全然関係ないのね。その名の通りエスケープなのね…。いまやっと色々わかっです…。30手前で…。

でも実装系でちょっとずつ ASCII のどこまでをエスケープするかが違っちゃってるみたいです。一般的には 20〜72 までなのかなあ?(全然試してない発言)。

EUC-JP は3バイトの文字もある

タイトルの通り。ちびった…。