https://ja.wikipedia.org/wiki/Punycode を見ていました。

基本的に、任意の utf 文字列を Punycode へ変換する際には、

  1. ASCII文字のみ をそのままコピー
  2. 非ASCII文字たち をエンコードしながら、 1. の末尾に - の後ろにくっつける

と、理解したのですが、特に複数個、非ASCII文字が存在した場合のエンコードないしデコードの方法がいまいち理解できていないです。

1文字だけ非ASCII文字を含んでいる bücherは、エンコードした結果は bcher-kvaですが、これは次の処理でもってデコードできるのだと理解しました。

  1. kva は 10,21,0 なので、 10 + 21*35 = 745, 特に、 a は 0 なので、数値の終わりとして取り扱われている。
  2. length('bcher') + 1 で 6 を取得する
  3. 745/6 で 124 を取得するので、 124 + 128 == 252 なので、 ü を挿入するべきだとわかる
  4. 745 % 6 で 1 を取得したので、 1文字の直後にüを挿入する

のですが、複数文字のデコードが一体どのように実現されているのかがよくわかっていないです。特に、 büücherbcher-kvaa とエンコードされ、 bücüherbcher-kvab, ýbücherbcher-kvaf らしいですが、これは一体どういうロジックでデコードされているのでしょうか。