# idnkitの変換処理の詳細

idnkitライブラリおよびidnconv, idncmp, idncheckコマンドが、実際に どのような手順でエンコード処理やデコード処理を行っているのかを 記します。

- 処理工程
- エンコード処理の詳細
- デコード処理の詳細

## 処理工程

idnkitの国際化ドメイン名のエンコード処理 (Punycodeへの変換; 通常変換) およびデコード処理 (Punycodeからの変換; 逆変換) では、 処理を「アクション」という細かな工程に分け、それを順に実行しています。

idnconv, idncmp, idncheckの各コマンドや各種API関数では、任意の アクションを省略するよう指示することもできます。 これによって、各アクションで具体的に何が行われ、実行されるとドメイン 名に対してどのような影響があるのかを知ることができます。 (具体的な省略の指示方法については、各コマンドおよび関数のドキュメント をご覧下さい。)

ただし、アクション同士の実行順序を変えることはできません。 (「マッピング」アクション内では処理順序は設定によって変えられますが、 アクション同士の実行順序は変えられません。)

## エンコード処理の詳細

idnkitが国際化ドメイン名をエンコードする際、内部では次のような順番で 各アクションを実行します。

1. ローカルエンコーディングからUnicodeへの変換
2. マッピング
   設定で指定されたマッピング処理を行います。
3. ASCIIの英大文字を小文字に変換
   各ラベルに含まれる "A".."Z" は、対応する "a".."z" にそれぞれ変換されます。
4. PunycodeからUnicodeへの変換
   国際化ドメイン名がPunycodeラベルを含んでいる場合、いったんUnicode ラベルに変換されます。
5. 禁止コードポイントチェック
   いずれかのラベルがIDNA2008で使用を禁止されているUnicodeコードポイント を含んでいた場合は、エラーを出力して処理を中止します。
6. 未割り当てコードポイントチェック
   いずれかのラベルがUnicodeで文字の割り当てが行われていないコードポイント を含んでいた場合は、エラーを出力して処理を中止します。
7. NFC適用済みチェック
   各ラベルが、NFC (Unicodeの正規化形式C; Unicode Normalization Form C) 適用済みであることを確認します。 各ラベルに再度NFCを適用し、適用前後で変化があった場合は、エラーを 出力して処理を中止します。
8. ACE接頭辞チェック
   いずれかのラベルの3文字目と4文字目が共に「-」(U+002D; HYPHEN-MINUS) であった場合は、エラーを出力して処理を中止します。 このチェックは、「Unicodeラベルへの変換」工程を行って変換された ラベルに対してのみ行われます。
9. ハイフンチェック
   いずれかのラベルの先頭もしくは末尾が「-」(U+002D; HYPHEN-MINUS) であった場合は、エラーを出力して処理を中止します。 このチェックは、ドメイン名登録プロトコルでのみ行われます。
10. 合成文字チェック
    いずれかのラベルの先頭のコードポイントが、合成文字 (combining character) だった場合は、エラーを出力して処理を中止します。
11. 「連結制御文脈依存文字 (CONTEXTJ)」チェック
    各ラベルに含まれる「連結制御文脈依存文字 (CONTEXTJ)」おのおのに対して、 文脈的にその文字が出現しても良い位置にあるかどうかをチェックします。 置かれてはいけない場所にあれば、エラーを出力して処理を中止します。
12. ドメイン名登録プロトコル用「その他文脈依存文字 (CONTEXTO)」チェック
    各ラベルに含まれる「その他制御文脈依存文字 (CONTEXTO)」おのおのに対して、 文脈的にその文字が出現しても良い位置にあるかどうかをチェックします。 置かれてはいけない場所にあれば、エラーを出力して処理を中止します。 このチェックは、ドメイン名登録プロトコルでのみ行われます。
13. ドメイン名参照プロトコル用「その他文脈依存文字 (CONTEXTO)」チェック
    各ラベルに含まれる「その他制御文脈依存文字 (CONTEXTO)」おのおのに対して、 文脈判定ルールが定義されているか否かをチェックします。 文脈判定ルールが定義されていなければ、エラーを出力して処理を中止します。 このチェックは、ドメイン名参照プロトコルでのみ行われます。
14. BIDI (bidirectional display; 双方向表示) チェック
    ドメイン名がBIDIに関係するコードポイントを含んでいる場合、IDNA2008の 定めるBIDIチェックを行います。 いずれかのラベルがチェックに引っかかると、エラーを出力して処理を中止します。
15. ローカルチェック
    ローカルチェックの実行が指示されている場合は、チェックを行います。 いずれかのラベルがチェックに引っかかると、エラーを出力して処理を中止します。
16. Punycodeへの変換
    各ラベルをPunycodeラベルに変換します。
17. ラベル長チェック
    各ラベルが、1..63文字の範囲に収まっているかどうかチェックします。 範囲外の長さになっているラベルがあれば、エラーを出力して処理を中止 します。
18. ラウンドトリップチェック
    「PunycodeからUnicodeへの変換」で変換を行ったラベルに対しては、 元と同じPunycode表現に戻ったか否かを確認します。 もし両者に違いがあれば、エラーを出力して処理を中止します。

## デコード処理の詳細

idnkitが国際化ドメイン名をデコードする際、内部では以下の順番で アクションを実行します。 エンコードとは完全な対称にはなっていない点に、注意して下さい。

1. ローカルエンコーディングからUnicodeへの変換
2. マッピング
   設定で指定されたマッピング処理を行います。
3. ASCIIの英大文字を小文字に変換
   各ラベルに含まれる "A".."Z" は、対応する "a".."z" にそれぞれ変換されます。
4. PunycodeからUnicodeへの変換
   国際化ドメイン名に含まれるPunycodeラベルは、すべてUnicodeラベルに変換 されます。
5. 禁止コードポイントのチェック
   いずれかのラベルがIDNA2008で使用を禁止されているUnicodeコードポイント を含んでいた場合は、エラーを出力して処理を中止します。
6. 未割り当てコードポイントのチェック
   いずれかのラベルがUnicodeで文字の割り当てが行われていないコードポイント を含んでいた場合は、エラーを出力して処理を中止します。
7. NFC適用済みチェック
   各ラベルが、NFC (Unicodeの正規化形式C; Unicode Normalization Form C) 適用済みであることを確認します。 各ラベルに再度NFCを適用し、適用前後で変化があった場合は、エラーを 出力して処理を中止します。
8. ACE接頭辞チェック
   いずれかのラベルの3文字目と4文字目が共に「-」(U+002D; HYPHEN-MINUS) であった場合は、エラーを出力して処理を中止します。 このチェックは、「Unicodeラベルへの変換」工程を行って変換されたラベルに 対してのみ行われます。
9. ハイフンチェック
   いずれかのラベルの先頭もしくは末尾が「-」(U+002D; HYPHEN-MINUS) であった場合は、エラーを出力して処理を中止します。 このチェックは、ドメイン名登録プロトコルでのみ行われます。
10. 合成文字チェック
    いずれかのラベルの先頭のコードポイントが、合成文字 (combining character) だった場合は、エラーを出力して処理を中止します。
11. 「連結制御文脈依存文字 (CONTEXTJ)」チェック
    各ラベルに含まれる「連結制御文脈依存文字 (CONTEXTJ)」おのおのに対して、 文脈的にその文字が出現しても良い位置にあるかどうかをチェックします。 置かれてはいけない場所にあれば、エラーを出力して処理を中止します。
12. ドメイン名登録プロトコル用「その他文脈依存文字 (CONTEXTO)」チェック
    各ラベルに含まれる「その他制御文脈依存文字 (CONTEXTO)」おのおのに対して、 文脈的にその文字が出現しても良い位置にあるかどうかをチェックします。 置かれてはいけない場所にあれば、エラーを出力して処理を中止します。 このチェックは、ドメイン名登録プロトコルでのみ行われます。
13. ドメイン名参照プロトコル用「その他文脈依存文字 (CONTEXTO)」チェック
    各ラベルに含まれる「その他制御文脈依存文字 (CONTEXTO)」おのおのに対して、 文脈判定ルールが定義されているか否かをチェックします。 文脈判定ルールが定義されていなければ、エラーを出力して処理を中止します。 このチェックは、ドメイン名参照プロトコルでのみ行われます。
14. BIDI (bidirectional display; 双方向表示) チェック
    ドメイン名がBIDIに関係するコードポイントを含んでいる場合、IDNA2008の 定めるBIDIチェックを行います。 いずれかのラベルがチェックに引っかかると、エラーを出力して処理を中止します。
15. ローカルチェック
    ローカルチェックの実行が指示されている場合は、チェックを行います。 いずれかのラベルがチェックに引っかかると、エラーを出力して処理を中止します。
16. ラウンドトリップチェック
    「PunycodeからUnicodeへの変換」で変換を行ったラベルについては、再度 Punycodeへ変換してみて、元と同じPunycode表現に戻るかどうかを確認 します。 もし両者に違いがあれば、エラーを出力して処理を中止します。
17. Unicodeからローカルエンコーディングへの変換