Punycode
ドメイン名とIPアドレスの対応関係を管理するDNS(Domain Name System)では仕様上、ドメイン名としてアルファベット(大文字と小文字の区別なし)、数字、ハイフン(マイナス記号)のみを用いることができる。
そのままではドメイン名に様々な言語の文字を取り入れることができないため、一定の規則に従って仕様外の文字を英数字とハイフンの組み合わせに変換してDNS上で取り扱う「ACE」(ASCII Compatible Encoding)という手法が考案された。PunycodeはACEの方式の一つで、DNS上では「xn--」という識別子に続けて変換後の文字列を表記する。
変換工程では、まず元のドメイン名を英数字とそれ以外の文字列に分離する。英数字以外の文字はUnicodeのコード番号に置き換え、英数字側のどこに挿入するかを表す位置情報と合わせて数値で表現する。得られた数値列を36進数(一桁を0~9、a~zの36文字で表す)表記に変換し、英数字側の末尾にハイフンで区切って連結する。
例えば、「punycode表記の例.jp」という日本語JPドメイン名を変換すると、「表記の例」の部分が「nf4gq06y9y2geie」という表現に変換され、Punycode識別子の「xn--」、英数字部分の「punycode」と連結されて「xn--punycode-nf4gq06y9y2geie.jp」という表記に変換される。
同じ要領でトップレベルドメイン(TLD)名も国際化することができる。例えば、「日本語TLD.日本」というドメイン名は、TLDの「日本」とセカンドレベルドメインの「日本語TLD」がそれぞれ変換され、「xn--tld-s08fl0dtz6h.xn--wgv71a」という表記になる。
Punycodeの仕様は2003年にIETFによりRFC 3492として標準化された。国際化ドメイン名の導入時、当初はACEとして識別子「bq--」から始まる「RACE」(Row-based ACE)という符号化方式が試験的に用いられていたが、標準としてPunycodeが正式採用されることになり、現在はPunycodeで運用されている。