[1] [DFN[[[Bootstring]]]] は、小さな (少ない) [[符号位置]]の[[集合]]によってより大きな[[集合]]の[[文字列]]を表現するための[RUBY[[[算法]]][アルゴリズム]]です [SRC[>>2]]。 [[Bootstring]] の[[引数]]を特定の値に固定した[RUBY[[[実現値]]][インスタンス]] ([[プロファイル]]) として [[Punycode]] があり、 [[IDNA]] で[[国際化ドメイン名]]のために使われています。 * 仕様書 - [2] [CITE@en[RFC 3492 - Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)]] * 性質 [3] [[Bootstring]] は次の性質を持つように設計されています [SRC[>>2 1.1]]。 - [4] [RUBYB[[[完全性]]]@en[completeness]]: あらゆる[RUBYB[[[拡張文字列]]]@en[extended string]] (任意の[[符号位置]]の列) は、 [RUBYB[[[基本文字列]]]@en[basic string]] ([RUBYB[[[基本符号位置]]]@en[basic code point]]の列) によって表現できます。 - [5] [RUBYB[[[固有性]]]@en[uniqueness]]: ある[[拡張文字列]]を表現する[[基本文字列]]は、 高々1つしか存在しません。 - [6] [RUBYB[[[可逆性]]]@en[reversibility]]: [[拡張文字列]]を[[基本文字列]]に[[写像]]できたとすると、 その[[基本文字列]]から元の[[拡張文字列]]に再変換することができます。 - [7] [RUBYB[[[効率的符号化]]]@en[efficient encoding]]: [[基本文字列]]の長さと[[拡張文字列]]の長さの[[比]]は小さいです。 - [8] [RUBYB[[[単純性]]]@en[simplicity]]: [[符号化]]と[[復号]]の[[算法]]は十分単純です。 -- [10] [[効率性]]と[[単純性]]は必ずしも両立しませんが、 [[Bootstring]] は両者のバランスがとれたものを目指しています。 - [9] [RUBYB[[[可読性]]]@en[readability]]: [[拡張文字列]]中の[[基本符号位置]]は、 [[基本文字列]]中にそのまま出てきます。 -- [11] といってもその主目的は[[効率性]]なのですが。 * 基本符号位置分居 ** 符号化 [13] [[拡張文字列]]を [[Bootstring]] で[[符号化]]する時には、 [[基本符号位置]]はすべて元々の順序でそのまま[[基本文字列]]の先頭に含めます。 [SRC[>>2 3.1]] [14] [[基本符号位置]]を並べた後には[[区切子]]を置きます。 ([[基本符号位置]]がまったく無いときは[[区切子]]は含めません。) [[区切子]]は特定の[[基本符号位置]]とし、[[基本文字列]]のその後の部分には使わないものとします。 [SRC[>>2 3.1]] [17] これを[DFN[[RUBYB[基本符号位置分居]@en[basic code point segregation]]]]と呼びます。 ** 復号 [15] [[復号器]]は、[[基本文字列]]中の最後の[[区切子]]を探すことにより、 どこまでが[[基本符号位置]]を並べたものでどこからが非[[基本符号位置]]を表すものか判断できます。 [SRC[>>2 3.1]] ** 例 [16] [[Punycode]] での例: 「abcあいうえおxyz」は、 [PRE(code)[ abcxyz-k43eqasuw ]PRE] ... となります。[[基本符号位置]]で表せる部分が「abcxyz」で、 その後に[[区切子]]として「[CODE(char)[[[-]]]]」が挟まり、 最後に「あいうえお」を[[符号化]]した文字列が続きます。 * 挿入非整列符号化 [18] [[基本符号位置]]と [CODE(char)[[[-]]]] を取って残った部分は非[[基本符号位置]]を表しています。 これは[[一般化可変長整数]]を使った[[非負整数]]として表された[[差分]]の列となっています。 [SRC[>>2 3.2]] [19] [[復号器]]の仕事は[[基本符号位置]]の列にこの[[差分]]の列を適用して元の[[拡張文字列]]に戻すことであり、 [[符号化器]]の仕事はそうなるような[[差分]]の列を生成することとなります。 [20] この符号化の方式は[DFN[[RUBYB[[[挿入非整列符号化]]]@en[insertion unsort coding]]]]]]と呼ばれています。 ** 復号 [21] [[復号]]の手順をおおまかに表すと次のようになります [SRC[>>2 3.2]]。 = まず、[[基本文字列]]の最初の[[基本符号位置]]の部分を取り出します。 = 次に、[[区切子]]の後の[[差分]]の列から[[差分]]を1つずつ取出し、それを適用します。[[差分]]1つに対して1つの非[[基本符号位置]]が挿入されることになります。 =- [[差分]]の列は、「先へと進む回数を表す値」と「挿入する[[符号位置]]を表す値」が交互に繰り返される[RUBYB[[[連長符号化]]]@en[run-length encoding]]になっています。 =- [[基本符号位置]]が挿入されるとしたら、それは[[誤り]]です。 * 実装 [12] [CITE[Encode::Bootstring - search.cpan.org]]