コード番号をASCII文字列として再変換
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/19 04:49 UTC 版)
「Punycode」の記事における「コード番号をASCII文字列として再変換」の解説
Punycode は、このコード番号を表すためにリトルエンディアンの一般化可変長整数を使用する。例として、コード番号745を「kva」と表す方法を示す。 一般化可変長整数では、各々の桁に異なる閾値を設け、これより小さい数字の表れる桁を最大桁とすることで、数字列の区切りを決める。 Punycode で用いられるリトルエンディアンの場合、小さい桁から表記されるため、先読みなしで任意の桁数の数字を表記できる。 Punycode の場合は、各桁に使える数字として36種の文字を使用する。アルファベット(大文字小文字を区別しない)の'a'から'z'が0から25を表し、数字の'0'から'9'が26から35を表す (このため、後述する式に出てくる底 (base) は、36となる)。 10進数0 1 2 3 … 24 25 26 … 34 35 一般化可変長整数a b c d … y z 0 … 8 9 したがって、「kva」は「10 21 0」を表す。ここで閾値は (1 1 26) であるとする。最初の桁 (kつまり10) の重みは1である。1桁目は1–35までの範囲の値をとるため、2桁目 (vつまり21) の重みは35となる。2桁目は同様に1–35の範囲の値をとるため、3桁目 (aつまり0) の重みは 352 = 1225 である。また、3桁目の値0は3桁目の閾値26よりも小さいため、ここで1つ目の数字列は終了であることがわかる。したがって「kva」は 10 × 1 + 21 × 35 + 0 × 1225 = 745 を表していることがわかる。 各桁の重みw(j)および閾値t(j)の値は、以下の式で計算される: w ( 0 ) = 1 {\displaystyle w(0)=1} w ( j ) = w ( j − 1 ) × ( b a s e − t ( j − 1 ) ) {\displaystyle w(j)=w(j-1)\times ({\mathit {base}}-t(j-1))} t ( j ) = b a s e × ( j + 1 ) − b i a s {\displaystyle t(j)={\mathit {base}}\times (j+1)-{\mathit {bias}}} (ただしt(j)は上式をtmin以下ならtmin、tmax以上ならtmaxとクランプしたものである。 bias は状態変数である。) base = 36, tmin = 1, tmax = 26 2つ目の文字を挿入する際には、さらにエンコードされたコード番号を繋げていけばよいが、挿入のたびにbiasの値が調節され、各桁の閾値と重みが変わることに注意する必要がある。biasの値が変わらない範囲であれば、単純に追加するだけでよい。例えば、"bücher" に2つ目の非ASCII文字を挿入しようとすると、前述のとおりデコーダは前に戻れないため、最初の挿入結果は "büücher" で、コードは "bcher-kvaa" となる。次の挿入可能位置は "bücüher" で "bcher-kvab" となる。同様に、続きの "bücherü" は "bcher-kvae" となり、次に来るのは "ýbücher" で "bcher-kvaf" である。
※この「コード番号をASCII文字列として再変換」の解説は、「Punycode」の解説の一部です。
「コード番号をASCII文字列として再変換」を含む「Punycode」の記事については、「Punycode」の概要を参照ください。
- コード番号をASCII文字列として再変換のページへのリンク