[文字コード] 一般化可変長整数
一般化可変長整数
国際化ドメイン名では, マルチバイト文字のドメイン名がDNS上でASCII文字にエンコードされてやり取りが行われる.
そのときに使われるエンコーディング方式はPunycodeと呼ばれ, Punycodeでのエンコード・デコード処理の一部にこの一般化可変長整数と呼ばれる仕組みが利用されている.
数値と一般化可変長整数の対応を以下に示す.
| 数値(10進数表記) | 一般化可変長整数 |
|---|---|
| 0 | a |
| 1 | ba |
| 2 | ca |
| ... | ... |
| 34 | 8a |
| 35 | 9a |
| 36 | bba |
| 37 | cba |
| ... | ... |
| 70 | 9ba |
| 71 | bca |
| 72 | cca |
| ... | ... |
| 1260 | 99a |
| 1261 | bbb |
| 1262 | cbb |
| ... | ... |
| 31885 | 99z |
| 31886 | bb0a |
| ... | ... |
| 44135 | 999a |
| 44136 | bb0b |
| ... | ... |
一般化可変長整数では, aが0, zが25, 0が26, 9が35を表し, リトルエンディアンのため, 一番右側の桁が最上位桁となる.
また, 一般化可変長整数には桁ごとに閾値が設定されており, 数値(10進数表記)から一般化可変長整数への変換は以下の式によって求められる.
数値(10進数表記) = 1桁目 + 2桁目 * 35 + 3桁目 * 1225 + 4桁目 * 12250
例えば, ひらがなの「あ」の一般化可変長整数l8jを10進数の整数に変換する場合, 11 + 34 * 35 + 9 * 1225 = 12226となる.
Punycodeでは, 1文字目は128からの差分で文字を表現するルールとなっているため, 128 + 12226 = 12354 = 0x3042 = U+3042となり, Unicodeでの「あ」を表現しているということが分かる.
また, 各桁に次の文字が使われていたらそこで数値の終了を表す.
| 桁 | 数値 |
|---|---|
| 1 | a |
| 2 | a |
| 3 | a - z |
| 4 | a - z |
さらに, マルチバイト文字の2文字目以降は桁の重み付けのルールが変わる.
次も近くの文字が採用されるという前提でエンコード後の表現ができるだけ短くなるように
- 数値(10進数表記)から一般化可変長整数への変換式
- 数値の終了を意味する文字
が変更される.