理想未来ってなんやねん

娘可愛い。お父さん頑張る。

国際化ドメイン名(IDN)に関するメモ

日本語のドメイン名を実現する国際化ドメイン名(IDN)について気になったのでメモしておきます。

背景技術について

日本語ドメイン名の下地となっている技術は国際化ドメイン名(IDN)である。ドメイン名は歴史的に英数字またはハイフンのみが使用可能であったが、この技術的制限をクリアしつつ、日本語を含む多国語ドメインを使用可能にするものとして、IDNが発案された。

入力されたURLのうち、ドメイン名部分をPunycode変換により英数字とハイフンの文字列に変換し(例:「日本語.jp」から「xn--wgv71a119e.jp」)、これをもってDNS正引きすることにより、Punycodeドメイン名登録されたサーバへのアクセスを実現するというものが、Punycodeを用いたIDNの概要である。

Punycode変換とは

Punycode(ピュニコード)とは、国際化ドメイン名で使われる文字符号化方式で、RFC 3492で定義されている。Unicodeで書かれた文字列をDNS内の制限された文字コード空間でも使えるようにするための方式で、ユーザーエージェントの実装に依存する。

ドメイン名としてPunycodeを使用する際は、ドット(.)で区切られたドメイン名の階層レベルごとにプレフィックスとして"xn--"を使用し、エンコードされた文字列を続ける。大文字と小文字は区別されない。例えば「ドメイン名例.jp」の場合は"xn--eckwd4c7cu47r2wf.jp"、「ウィキペディア.ドメイン名例.jp」の場合は"XN--CCKBAK0BYL6E.XN--ECKWD4C7CU47R2WF.JP"、「例え.テスト」の場合は"xn--r8jz45g.xn--zckzah"のようになる。

Punycodeエンコーディング手順

RFC 3492(日本語訳)にコードが載っている。

手順の抜粋

  1. ASCIIコードの分離
    • 最初に入力文字列中にあるすべての基本文字(ASCII)をそのままコピーする。
    • 基本文字以外の文字がある場合は、最後に区切り文字(ハイフン)を追加する。
  2. コード番号を挿入して非ASCII文字をエンコードする。
  3. コード番号をASCII文字列として再変換する。

ライブラリ

JPNICがidnkit(libidnkitlite)を配布しています。
http://www.nic.ad.jp/ja/topics/2003/20030319-01.html

以下、各スクリプトで使えそうな物を列挙します。
取り急ぎ下調べとして情報を集めてみたので動作未確認です。

PHP

PEARPECLPHP Classesで配布されているのでお好みに合わせてどうぞ。

Ruby

RubyGemsでLibIDN Ruby Bindingsが配布されているようです。

Perl

CPANで色々配布されているようです。

結論


そんな感じで、ご参考になれば幸いです。