Punycode
次のエンコーディング手順を理解するために、先にデコーダの動作を理解する必要がある。
デコーダは、2つの状態変数 i と n を持つオートマトンである。 i は分離した後のASCII文字列への挿入位置を表し、その範囲は0 (文字列の先頭への挿入を表す) からASCII文字列の長さ (文字列の末尾への挿入を表す) である。従って、この例では0–5となる。nは挿入する文字のコードポイントである。
i は0から始まり、n は128 (非ASCII文字の最初のコードポイント) から始まる。状態遷移は単調であり、遷移すると i が1だけ増加する。ただし i がすでに最大値の場合は n が1増加し、i は0に戻る。つまり、挿入するべき箇所がなくなると、挿入すべき文字が1つ後の物となる。要するに、各状態遷移の際、nで表されるコードポイントを文字列に挿入するか、挿入をスキップするか、という動きとなる。
コード番号は、エンコーダによって生成される数値であり、デコーダが文字を挿入する前にスキップすべき挿入可能位置がいくつあるかを数値化したものである。"ü" のUnicodeコードポイントはU+00FC, 10進数で表すと252である。よって、ü の字を文字列の1文字目の後ろに挿入するには、ü より前にある124 (251 - 127 = 124) 種類の非ASCII文字が、"bcher" の中に6か所ある挿入ポイントに挿入されるのをスキップし、さらに0文字目 (つまり文字列の先頭) にüが挿入されるのをスキップする必要がある。したがって、デコーダには必要な1文字を挿入するために、(124 × 6) + 1 = 745回の非ASCII文字挿入をスキップするようデコーダに伝える必要がある。