Punycode

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

概要[編集]

ドメイン名として Punycode を使用する際は、ピリオド(.)で区切られたドメイン名の階層レベルごとにプレフィックスとして「xn--」を使用し、エンコードされた文字列を続ける。大文字と小文字は区別されない。

可読なドメイン名 Punycodeでのドメイン名
ドメイン名例.jp xn--eckwd4c7cu47r2wf.jp
ウィキペディア.ドメイン名例.jp xn--cckbak0byl6e.xn--eckwd4c7cu47r2wf.jp
例え.テスト xn--r8jz45g.xn--zckzah

エンコーディング手順[編集]

この節では Punycode のエンコーディング手順を、「bücher[1]がどのようにして「bcher-kva」と変換されるかを例にとって説明する。

ASCII文字の分離[編集]

最初に入力文字列中にあるすべての基本文字(ASCII)を、基本文字以外の文字は飛ばす。基本文字以外の文字がある場合は、最後に区切り文字(ハイフン)を追加する。

入力文字列 処理後
bücher bcher-
日本Japan Japan-

ASCII文字の挿入をコード番号としてエンコード[編集]

次のエンコーディング手順を理解するために、先にデコーダの動作を理解する必要がある。デコーダは2つの状態変数 in を持つオートマトンである。 i は文字列への挿入位置のインデックスで、その範囲は0(これは文字列の先頭への挿入を表す)から現在の文字列の長さ(文字列の末尾への挿入を表す)である。

i は0から始まり、n は128(非ASCII文字の最初のコードポイント)から始まる。状態遷移は単調であり、遷移すると i が増加する。ただし i がすでに最大値の場合は n が増加し、i は0に戻る。各状態遷移の際、nで表されるコードポイントを文字列に挿入するか、挿入をスキップする。

エンコーダによって生成されるコード番号は、デコーダが文字を挿入する前に、スキップすべき挿入可能位置がいくつあるかを数値化する。"ü"のコードポイントは252である。よって ü の字を文字列の1文字目の後ろに挿入するには、"bcher"の中に6か所ある挿入ポイントに、üより前にある124の非ASCII文字が挿入されるのをスキップし、さらに0文字目(つまり文字列の先頭)にüが挿入されるのをスキップする必要がある。したがって、デコーダには必要な1文字を挿入するために、(6 × 124) + 1 = 745 の挿入可能位置をスキップするよう伝える必要がある。

コード番号をASCII文字列として再変換[編集]

Punycodeはコード番号を表すために一般化可変長整数を使用する。例としてコード番号745を「kva」と表す方法を示す。

リトルエンディアンを用いた数値系を使うことにより、区切り記号を使わずに可変長の整数を表現することができる。閾値より小さい桁がその数字の終わりであり、有効桁数を表すからだ。閾値は効率を高めるため、数値中での位置と前回の挿入位置に依存させる。相応して、各桁の重み付けも変化する(通常の数値では、例えば右端から3番目の桁の重みは100である)。

Punycodeの場合は36種の文字を使用する。アルファベット(大文字小文字を区別しない)の'a'から'z'が0から25を表し、数字の'0'から'9'が26から35を表す。したがって「kva」は「10 21 0」を表す。3桁の数値の最初の桁はbから9までの範囲の値をとるため、2桁目の重みは36ではなく35となる。「a」は数値の終わりを表している。したがって「kva」は 10 + 35 × 21 = 745 を表しているのである。

"bücher"に2つ目の特殊文字を挿入しようとすると、最初の挿入可能位置は"büücher"で、コード"bcher-kvaa"となる。次の挿入可能位置は"bücüher"で"bcher-kvab"となる。同様に続き"bücherü"は"bcher-kvae"となり、次に来るのは"ýbücher"で"bcher-kvaf"である。

脚注[編集]

  1. ^ ドイツ語で「本」を意味する。

関連項目[編集]

外部サイト[編集]