ここではまず、国際化ドメイン名を理解して頂けるよう、その成り立ちに ついて簡単に説明します。
従来、ドメイン名には、英字、数字、およびハイフンしか使えませんでした。 国際化ドメイン名とは、これらに加えていろいろな言語の文字を使える ようにしたものです。 "Internationalized Domain Name" (国際化ドメイン名) の頭文字を取り、 IDNと呼ばれます。
国際化ドメイン名の規格化は、 IETF (The Internet Engineering Task Force) で進められて来ました。 規格は、"Internationalized Domain Names in Applications" の頭文字を 取って "IDNA" と総称されます。
最初のIDNAの規格は2003年に制定され、現在ではこれをIDNA2003と呼んで います。 IDNA2003に則った国際化ドメイン名は広く普及しましたが、次第に課題も 明らかになってきました。 IDNA2003では、使用するUnicodeのバージョンが3.2.0に固定されていて 新しいバージョンが使えないこと、記号文字のようにドメイン名を利用 する上で混乱を生じさせかねないものが一部使用できてしまうことなど です。
そのため、規格の改訂作業がIETFで行われました。 新規格の方式が合意されたのが2008年だったため、IDNA2008と呼ばれて います。
旧バージョンであるidnkitバージョン1はIDNA2003の仕様に沿って実装されて います。 これに対して、本ドキュメントで解説するidnkitバージョン2は、IDNA2008 の仕様に準じて実装されています。
idnkitバージョン2はIDNA2003には対応していませんので、ご注意下さい。
IDNA2003およびIDNA2008では、国際化ドメイン名を表現するための エンコーディングとして、Punycodeという方式を採用しています。 Punycodeは、Unicodeで定義されている文字を (従来のドメイン名で使用が 許されている) 英数字とハイフンだけで表現できるようになっています。
このように、ASCII文字だけで表現するエンコーディングのことをACE (ASCII Compatible Encoding) と呼びます。 PunycodeはACEの一方式であり、IDNA2003およびIDNA2008で正式採用されて いるACEの方式がPunycode、ということになります。 ちなみに、IDNA2003の標準化作業の過程で、Punycode以外にも様々なACEが 提案されました。
例として、キリル文字で書かれた「привет」というドメイン名を Punycodeで表現すると、次のようになります。
xn--b1agh1afp
先頭の "xn--
" によって、このドメイン名が国際化ドメイン名
であることを示しています。
従来のドメイン名も英数字とハイフンで表現されますから、区別するための
印が必要となるのです。
このように国際化ドメイン名であることを示すために、先頭に付ける文字列
のことをACE接頭辞 (ACE prefix) と呼びます。
通常使われるドメイン名は、複数のラベルから構成されますが、ACE接頭辞 はラベル単位に付与されます。 ただし、英数字とハイフンだけからなる従来形式のラベルには付与されず、 Punycodeにも変換されません。 たとえば、「привет.мир.jp」というドメイン名の Punycode表現は、次のようになります。
xn--b1agh1afp.xn--h1ahn.jp
従来のドメイン名は英数字とハイフンだけで表現されていますので、Unicode の様々な文字を扱うことは想定されていません。 ドメイン名を扱うソフトウェアもそれは同様で、動作に支障を来たす可能性が あります。 しかしACEであれば、英数字とハイフンだけで表現されるため、こうした問題 は回避できます。 ただし、ユーザからドメイン名の入力を直接受け付けるアプリケーション では、入力された国際化ドメイン名をPunycodeに変換してから名前解決を 行うといった処理が必要になります。
国際化ドメイン名では、Unicodeの定義する様々な文字を利用可能になって いますが、どんな文字でも自由に扱えるわけでありません。 たとえば、音楽記号などは使用することができません。 また、国際化ドメイン名でも従来の英数字、ハイフンを混ぜて使用すること は可能ですが、3文字目と4文字目が共にハイフンとなるようなラベルは ACE接頭辞と紛らわしいため、禁止されています。
IDNA2003およびIDNA2008では、どのようなラベルが正しく、どのようなラベル が禁止されているのかを、明確に規定します。 (ただしIDNA2003とIDNA2008には、この部分について差異があります。)
ユーザが国際化ドメイン名を入力する場合、入力されたUnicodeコードポイント 列がドメイン名と常に1対1になるとは限りません。
たとえばUnicodeでは、"ä" という文字に対して、"ä" そのもの をコードポイント1個 (U+00FC) で表現するやり方と、"a" (U+0061) という コードポイントの直後に発音記号 "¨" (U+0308) を配置して コードポイント2個で表現するやり方を用意しています。 Unicodeでこのように複数の表現方法が存在する文字は、無数にあります。
したがって、"ä" のような文字を含む国際化ドメイン名については、 コードポイント列は一通りにならないということになります。 コードポイント列が異なれば、UnicodeからPunycodeに変換した結果も 異なってしまい、Punycode上は別々のドメイン名として表現されてしまい ます。
そこでこうした不便さを解消するため、IDNA2008では入力されたドメイン名 に対して「マッピング」という前処理を施して良いことになって います。 "a" + "¨" のようなコードポイント表現については、同一と見なされる べき "ä" という表現に変換した上で、Punycodeに変換して良いのです。
蛇足ですが、従来規格IDNA2003では "Nameprep" (Name Preparation) という 形で、マッピングの処理方法が厳格に規定されていました。 それに対してIDNA2008ではかなり緩やかなものとなっており、ある程度 アプリケーションの裁量でマッピング処理の方法を決めて良いようになって います。
簡単にまとまると、IDNA2008では国際化ドメイン名に関して次のように規定 しています。