[2] [DFN[Punycode]] は、[[DNS]] の [[Unicode]] 対応 ([[IDN]]) のために用いられている[[文字コード]]です。 [[Unicode]] の[[文字列]]を[[英数字]]だけで表現します。 * 仕様書 - [1] [CITE@en[RFC 3492 - Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)]] * 算法 [4] [[Punycode]] は、 [[Bootstring]] の[[実現値]]です。 ** 引数 [9] [[Punycode]] は、 [[Bootstring]] の[[引数]]を次のように設定したものです [SRC[>>1 5.]]。 - [10] [VAR[base]] 36 - [11] [VAR[t[SUB[min]]]] 1 - [12] [VAR[t[SUB[max]]]] 26 - [13] [VAR[skew]] 38 - [14] [VAR[damp]] 700 - [15] [VAR[initial[SUB[bias]]]] 72 - [16] [VAR[initial[SUB[n]]]] 128 (0x80) [17] これは [[Unicode]] の[[符号位置]]に対して有効に機能するような[[引数]]の設定となっています。 ([[算法]]としての制約は[[非負整数]]の列が入力となることであり、 [[Unicode]] である必要はありません。) [SRC[>>1 5.]] - [18] [[基本符号位置]]は [[0x00]] ... [[0x7F]] の [[ASCII]] の[[符号位置]]です。 [SRC[>>1 5.]] - [19] [CODE(char)[[[-]]]] が[[区切子]]です。 [SRC[>>1 5.]] - [20] [[0x41]] ([CODE(char)[[[A]]]]) ... [[0x5A]] ([CODE(char)[[[Z]]]]) が 0 ... 25 を表します。 [SRC[>>1 5.]] - [21] [[0x61]] ([CODE(char)[[[a]]]]) ... [[0x7A]] ([CODE(char)[[[z]]]]) が 0 ... 25 を表します。 [SRC[>>1 5.]] - [22] [[0x30]] ([CODE(char)[[[0]]]]) ... [[0x39]] ([CODE(char)[[[9]]]]) が 26 ... 35 を表します。 [SRC[>>1 5.]] - [23] その他の[[基本符号位置]]は[[数字]]や[[区切子]]として使いません。 [28] [[復号器]]は[[大文字]]と[[小文字]]、その混合のいずれも認識しなければ[['''なりません''']]。 [[符号化器]]は[[大文字・小文字混合注釈]]を使う場合を除き、[[大文字]]のみ、または[[小文字]]のみを出力する[['''べきです''']]。 [SRC[>>1 5.]] ** 型の大きさ [32] [[IDNA]] 用途では、 26ビット[[符号無し整数]]を使うと (正当な入出力に対して) [[桁溢れ]]なく処理できます。26ビットあれば [[U+10FFFF]] まで、 63[[文字]]までの[[ラベル]]を正しく扱えます。 [SRC[>>1 6.4]] [33] [[IDNA]] 以外でより長い[[文字列]]を扱いたい時、 [[U+10FFFF]] より先が含まれる [[ISO/IEC 10646]] [[文字列]] (やそれ以外の[[文字コード]]の[[文字列]]) を扱いたい時には 26ビットでは足りないかもしれません。 ** IDNA との関係 [24] [[Bootstring]] の[[算法]]と [[Punycode]] の[[引数]]の組み合わせからは、 [[ドメイン名]]の[[ラベル]]で認められていない出力が得られることがあります。 あらゆる [[ASCII]] の[[符号位置]]が[[基本符号位置]]なのでそのまま結果に含まれていますし、 先頭や末尾が [CODE(char)[[[-]]]] になることもあります。ですが、 - [25] [[ラテン文字]]、[[数字]]、[CODE(char)[[[-]]]] 以外の [[ASCII文字]]は、 [[IDNA]] の処理で [[Punycode]] の[[符号化]]の前に[[失敗]]を引き起こすか ([[UseSTD3ASCIIRules]] が真のとき)、あるいは[[失敗]]にならずにそのまま素通しとなりますが、これは [[IDNA]] が実装されてなくても同じなので、問題とはなりません。 - [26] 先頭が [CODE(char)[[[-]]]] になったとしても、[[ラベル]]として使うときはその前に [[ACE接頭辞]]が付加されるので、問題とはなりません。 [SRC[>>1 5.]] - [27] 末尾が [CODE(char)[[[-]]]] になるのは[[基本符号位置]]のみ ([[ASCII文字]]のみ) で構成されるときですが、その時は [[IDNA]] の処理 ([[ToASCII]]) で [[Punycode]] の[[符号化]]を行わないことになっているので、問題となりません。 [SRC[>>1 5.]] ** 大文字・小文字混合注釈 [29] [[Punycode]] は[[大文字・小文字混合注釈]]が使えるようになっています。 [SRC[>>1 5.]] ([VAR(math)[t[SUB[max]]]] が 26 で、25 以下は[[ラテン文字]]なので、[[差分]]の最後の1文字は常に[[大文字]]と[[小文字]]が存在する[[ラテン文字]]になります。) [30] ただし、[[ドメイン名]]では[[大文字・小文字不区別]]なので、[[大文字・小文字混合注釈]]も使われません。 [SRC[>>1 5.]] * ACE 接頭辞 [3] [[Punycode]] を表す [[ACE接頭辞]]は、 [DFN[[CODE@en[[[xn--]]]]]] です [SRC[[[RFC 3490]] 5.]]。 * 実装 [6] [CITE[Net::IDN::Punycode - search.cpan.org]] [5] [CITE[Encode::Punycode - search.cpan.org]] ;; >>6 の単なるラッパーです。 * 歴史 [7] [[Punycode]] は当初 [DFN[[[AMC-ACE-Z]]]] と呼ばれていました。 [8] [[IETF]] で [[Punycode]] を用いることが決定するまでは、 [[RACE]] が [[ACE]] として採用される可能性が高いと考えられており、 実際に [CODE@en[[[.com]]]] や [CODE@en[[[.jp]]]] など一部の [[TLD]] が [[RACE]] を用いて [[IDN]] を運用していました。 [31] [CITE@ja[@IT:DNS Tips:Punycodeって小さなコード?]] ( ([TIME[2011-03-07 07:38:52 +09:00]] 版))