複数個 非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 らしいですが、これは一体どういうロジックでデコードされているのでしょうか。