Punycode
Punycode(ピュニコード)とは、漢字やひらがななどのマルチバイト文字を、英数字のみに変換するための変換規則(UNICODEの符号化)のひとつ。国際化ドメイン名を実現するための符号化方式として、Adam M Costelloによって考案され、2002年10月にIETFによって RFC 3492として規定された。当初は、AMC(Adam M Costello)によって考案された26番目のACE(ASCII Compatible Encoding)ということで、AMC-ACE-Zと呼ばれていた(Zは26番目の文字)。その後、考案者によりPunycodeと名付けられた。
概要
ドメイン名として使える文字は、英数字とハイフン(-)の37文字である。既に、この仕様でのドメイン名は広く普及しており、仕様を変更するのは大変な手間とコストが発生する。そのため、互換性を維持するためには、日本語を含むマルチバイト文字で表されたドメイン名を使えるような「国際化ドメイン(以前は、多言語ドメインと呼ばれていた)」を実現するために、37種類の文字でマルチバイト文字を表す必要があった。
このように、マルチバイト文字を英数字(ASCIIコード)に変換することを、エンコーディング(encoding)という。エンコーディングの方法は、様々な種類があり、たとえば、URLエンコーディングという方法だと、「日本語」という文字列は「%E6%97%A5%E6%9C%AC%E8%AA%9E」と表すことが出来る。この方法でも、%を除けば英数字で表すことが出来るが、非常に長いドメイン名となってしまう。それで、より短い表現の可能なエンコーディングが多数提案され、その中で最も短く、もっとも使いやすいものとしてPunycodeが採用された。Punycodeで、「日本語」をエンコーディングすると「wgv71a119e」となる。
ちなみに、Punycodeの由来は、提案者のAdam M Costelloによると「UNICODEの読みをもじったもの」とのこと。
IDNとの違い
Punycodeは、国際化ドメイン名(IDN:Internationalized Domain Name)を実現するために考案されたものだが、国際化ドメイン名とイコールではない。Punycode自体は汎用のエンコーディングであり、国際化ドメイン名とは独立である。国際化ドメイン名で「日本語」を表すと、あたまに「xn--」が付いて「xn--wgv71a119e」となる。
また、Punycodeを使って国際化ドメイン名に変換する前に、nameprepやstringprepという正規化処理が行われる。これは、全角の「。」(句点)を半角の「.」(ドット)に変換するなどの処理である。
Punycode自体は国際化ドメイン名と独立であるが、Punycodeを処理するためのライブラリは、国際化ドメイン名ライブラリに含まれることが多い。
RFC
RFCのPunycodeの変換例には、以下のような例が書かれている。これは、提案者がたまたま日本の曲やTV番組に詳しかったためで、これらは英数字とマルチバイト文字の組み合わせ例とするのに最適ということらしい。
- 3年B組金八先生 → 3B-ww4c5e180e575a65lsy2b
- 安室奈美恵-with-SUPER-MONKEYS → -with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n
- Hello-Another-Way-それぞれの場所 → Hello-Another-Way--fc4qua05auwb3674vfr0b
- ひとつ屋根の下2 → 2-u9tlzr9756bt3uc0v
- MajiでKoiする5秒前 → MajiKoi5-783gue6qz075azm5e
- パフィdeルンバ → de-jg4avhby1noc0d
- そのスピードで → d9juau41awczczp
他のエンコーディング
国際ドメイン名が標準化される過程では、様々なエンコーディングが提案された。このうち、RACEは有力な候補として試験採用されていたが、最終的にはPunycodeになった。
外部リンク
- GNU IDN Library - Libidn - GNUによる国際化ドメイン名ライブラリ。Punycodeが実装されている。
- idnkit download - JPNICによる国際化ドメイン名ライブラリ。Punycodeが実装されている。