2009年01月16日 17:30 [Edit]

perl - URI::Escape::XS 0.04 - URI Encode と Punycode の共存

cpan

URI::Escape::XS 0.04 を Release したのでお知らせします。

きっかけは、これ。


IDN、国際化ドメイン名は、 URI Encode ではなく Punycode で encode しなければならない。よって「脆弱性診断.jp」は%E8%84%86%E5%BC%B1%E6%80%A7%E8%A8%BA%E6%96%AD.jpではなく、xn--eckwd4c7cu47r2wf.jpが正しい。

が、残りの部分は相も変わらず URI Encode しなければならない。

というわけでフルURIをきちんと(encode|decode)する関数、encodeURIComponentIDN()encodeURIComponentIDN()をURI::Escape::XSに追加した。

        # if you have CNet::IDN::Encode installed
        $safe = encodeURIComponentIDN("http://弾.jp/dan/")
        $str  = decodeURIComponentIDN("http:%2F%2Fxn--81t.jp%2Fdan%2F");

  encodeURIComponentIDN
    Same as "encodeURIComponent" except that the host part is encoded in
    punycode. Net::IDN::Encode is required to use this function.

    URIs with Internationalizing Domain Names require two encodings:
    Punycode for host part and URI escape for the rest.

    Currently only FULL URIs with "http:" or "https:" are supported.

  decodeURIComponentIDN
    Same as "decodeURIComponent" except that the host part is encoded in
    punycode. Net::IDN::Encode is required to use this function.

ただし、これを利用するには Net::IDN::Encode が必要になる。残念ながらCPAN shell経由のインストールは駄目で、sourceを持ってきてmakeしなければならない。しかもこれ、同じくClaus Färber がメンテしている Unicode::Stringprep に依存していて、これまた make が必要。

なぜそうなっているかというと、今のところPerlできちんとIDNを扱えるのがこれしかないようだから。Encode::Punycode も未だにCPAN shellはmiyagawa版をインストールしようとするのだが、最新版をメンテしているのは Claus Färber で、そして最新版は Net::IDN::Encode に依存する。はあ。

平たく言うと、Net::IDN::Encodeを使うのが(これでも)依存性最小というわけ。車輪の再発明をするには忙し過ぎるし....

というわけで、はてなをはじめ関係者各位、対応おねがいしまっす。

Dan the Man with too Many Encodings to Support


この記事へのトラックバックURL

この記事へのトラックバック
今度は、JavaScriptで。 404 Blog Not Found:perl - URI::Escape::XS 0.04 - URI Encode と Punycode の共存
javascript - URI Encode と Punycode の共存【404 Blog Not Found】at 2009年01月17日 20:53
この記事へのコメント
Punycodeの件ではご迷惑をおかけしています。CPAN indexの問題かな?

はてブの件でいうと別にエンコードする必要はなくて単にリンク、表示とも URI Escape *しない* で直接 http://弾.jp/ にリンクすればいいんじゃないでしょうか? IDN にエンコードするのはブラウザの仕事のような気がします。
Posted by miyagawa at 2009年01月17日 09:56