複数個 非ASCII 文字があった場合の Punycode のデコード処理が理解できない
https://ja.wikipedia.org/wiki/Punycode を見ていました。
基本的に、任意の utf 文字列を Punycode へ変換する際には、
- ASCII文字のみ をそのままコピー
- 非ASCII文字たち をエンコードしながら、 1. の末尾に
-
の後ろにくっつける
と、理解したのですが、特に複数個、非ASCII文字が存在した場合のエンコードないしデコードの方法がいまいち理解できていないです。
1文字だけ非ASCII文字を含んでいる bücher
は、エンコードした結果は bcher-kva
ですが、これは次の処理でもってデコードできるのだと理解しました。
kva
は 10,21,0 なので、10 + 21*35 = 745
, 特に、 a は 0 なので、数値の終わりとして取り扱われている。length('bcher') + 1
で 6 を取得する745/6
で 124 を取得するので、124 + 128 == 252
なので、ü
を挿入するべきだとわかる745 % 6
で 1 を取得したので、 1文字の直後にü
を挿入する
のですが、複数文字のデコードが一体どのように実現されているのかがよくわかっていないです。特に、 büücher
は bcher-kvaa
とエンコードされ、 bücüher
は bcher-kvab
, ýbücher
は bcher-kvaf
らしいですが、これは一体どういうロジックでデコードされているのでしょうか。