コンテンツにスキップ

Punycode

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。ArthurBot (会話 | 投稿記録) による 2008年12月4日 (木) 18:23個人設定で未設定ならUTC)時点の版 (ロボットによる 追加: ru:Punycode)であり、現在の版とは大きく異なる場合があります。

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

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

エンコーディング手順

ASCII文字の分離

最初に入力文字列中にあるすべての基本文字(ASCII)をそのままコピーします。基本文字以外の文字はスキップします(例:"bücher" → "bcher"、"日本Japan"→"Japan")。基本文字以外の文字がある場合は、最後に区切り文字(ハイフン)を追加します(例:"bücher" → "bcher-"、"日本Japan"→"Japan-")。

コード番号を挿入して非ASCII文字をエンコード

エンコーディング手順の次の部分を理解するために、先にデコーダの動作を理解する必要があります。デコーダは2つの状態変数 in を持つstate machineです。 i はインデックスです。その範囲は0(文字列の先頭)から現在の文字列の長さ(文字列の最後)です。


i はゼロから始まり、 n は128(非ASCII文字の最初のコードポイント)から始まります。 状態遷移はmonotonicです。 状態の変更は i を増加させます。 i が最大値に達したとき、 i をゼロにリセットし、 n を増加させます。状態の変更は、"n"で表されるコードポイントを挿入したり挿入しなかったりします。


エンコーダによって生成されるコード番号は、デコーダが文字を挿入する前に、スキップすべき挿入可能位置がいくつあるかをコード化します。"ü"のコードポイントは252です。

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

Punycodeはコード番号を表すためにgeneralized variable-length integersを使用します。 例としてコード番号745を「kva」と表す方法を示します。

little-endian orderingを用いた数値系は、区切り記号を使わずに可変長の整数を表現します。閾値より小さい桁がその数字の終わりであり、有効桁数を表します。閾値は数値中での位置と前回の挿入位置に依存します。 相応して、各桁の重み付けも変わります(通常の数値は、右端から3番目の桁の重みは100です)。


Punycodeの場合は36種の文字を使用します。アルファベット(大文字小文字を区別しない)の'a'から'z'が0から25を表し、数字の'0'から'9'が26から35を表します。したがって「kva」は「10 21 0」となります。2桁目の重みは36ではなく35です。なぜなら、3桁の数値の最初の桁はbから9までの範囲の値をとるからです。「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"となります。


関連項目

外部サイト