idnconv の仕様書
概要
idnconv は国際化ドメイン名のエンコード、デコードを行うツールです。
ここでは、idnconv の仕様について解説します。 使用方法については、 idnconv のガイド のほうをご覧ください。
実装
ドメイン名のエンコードやデコードの処理はすべて idnkit ライブラリ (libidnkit) の低レベル API (res モジュール および resconf モジュール) を 使用しています。
エンコードの処理
idnconv のエンコード (-reverse
オプション無指定時の動作)
では、入力データに対して一行ずつ次のような処理を行います。
- 入力行の読み込み
ファイルあるいは標準入力から 1 行分のデータを読み込みます。 - UTF-8 に変換
入力行をローカルエンコーディングから UTF-8 に変換します。 - 国際化ドメイン名が書かれた部分の検出
-whole
(または-w
) オプションが指定された 場合は、入力行全体を 1 つのドメイン名とみなします。指定されていない 場合は、入力行の中で次の条件をすべて満たす部分を国際化ドメイン名と みなして、一つずつ取り出します。- 1文字以上の非ASCII文字を含むこと
- 従来のドメイン名に許される文字 (アルファベット、数字、ハイフン)、 非ASCII文字、ピリオドだけから構成されていること
- 国際化ドメイン名を IDN エンコーディングに変換
取り出した個々の国際化ドメイン名を、エンコードして IDN エンコーディング に変換します。処理の詳細は次の通りです。- デリミタマッピング
句点「。」(U+3002) などをピリオド (U+002E) に変換します。 - ローカルマッピング
取り出した個々の国際化ドメイン名に対して、ローカルなマッピングを行います。-localmap
オプションでマッピング方式が指定されていれば、 その方式にしたがって行われます。指定されていなければ、設定ファイルの記述 にしたがって、国際化ドメイン名の TLD に応じたマッピングを行います。 ただし、-nolocalmap
が指定されていると、この処理は省略されます。 - NAMEPREP
NAMEPREP を行います。 順番にマッピング、正規化、禁止文字の検査、未割り当てコードポイントの検査、 双方向文字列の検査を行います。 禁止文字や未割り当てコードポイントが含まれていた場合や、 双方向文字列の制限に反していた場合には、 エラーを出力して処理を中止します。 ただし、-nonameprep
(または-N
) が指定されて いると、NAMEPREP 処理は一切行いません。 また、-nounassigncheck
(または-U
) が指定されて いると、未割り当てコードポイントの検査だけを行わないように、-nobidicheck
(または-B
) が指定されていると、 双方向文字列の検査だけ行わないようになります。 - ASCII 文字の検査
ASCII 文字に関する検査を行います。先頭か末尾にハイフン (U+002D) が 来ているラベル、もしくは英数字やハイフン以外の ASCII 文字を含んだ ラベルがあった場合は、エラーを出力して処理を中止します。 ただし、-noasciicheck
(または-A
) が指定 されていれば、この検査は飛ばします。 - IDN エンコーディングに変換
UTF-8 から IDN エンコーディングに変換します。 - 文字数の検査
ドメイン内の各ラベルの文字数を調べ、空のラベルや 64 文字以上のラベルが あれば、エラーを出力して処理を中止します。-nolengthcheck
(または-L
) が指定されて いれば、この処理は行いません。
- デリミタマッピング
- 結果を出力
行の内容を、変換結果として標準出力に出力します。
デコードの処理
idnconv のデコード (-reverse オプション指定時の動作、逆変換) は、 エンコードと似ていますが、処理は対称をなしていません。 入力データに対して一行ずつ次のような処理を行います。
- 入力行の読み込み
ファイルあるいは標準入力から 1 行分のデータを読み込みます。 - UTF-8 に変換
入力行をローカルエンコーディングで記述されているとみなして、UTF-8 に 変換します。 - 国際化ドメイン名が書かれた部分の検出
-whole
(または-w
) オプションが指定された場合は、 入力行全体を 1 つのドメイン名とみなします。指定されていない場合は、 入力行の中で (IDN エンコーディングで表現したものを含めて) 正しい ドメイン名とみなせるものを、すべて国際化ドメイン名として取り出します。 - 国際化ドメイン名をローカルエンコーディングに変換
取り出した個々の国際化ドメイン名を、デコードしてローカルエンコーディング に変換します。処理の詳細は次の通りです。- デリミタマッピング
句点「。」(U+3002) などをピリオド (U+002E) に変換します。 - NAMEPREP
NAMEPREP を行います。 順番にマッピング、正規化、禁止文字の検査、未割り当てコードポイントの検査、 双方向文字列の検査を行います。 禁止文字や未割り当てコードポイントが含むラベルは、入力時点の状態に戻し、 そのラベル対する変換処理は一切行わないようにします。 また、-nonameprep
(または-N
) が指定されていれば、 NAMEPREP 処理は行いません。-nounassigncheck
(または-U
) が指定されていると、 未割り当てコードポイントの検査だけを行わないように、-nobidicheck
(または-B
) が指定されていると、 双方向文字列の検査だけ行わないようになります。 - UTF-8 に変換
IDN エンコーディングから UTF-8 に変換します。 - ラウンドトリップチェック
ドメイン名を構成する個々のラベルに対してエンコードを行い、結果を前項の UTF-8 に変換」を実行する前の文字列と比較します。 両者が異なる場合、そのラベルは入力時点の状態に戻し、そのラベルに対する 変換処理は一切行わないようにします。 両者が同じであれば、ラベルを前項の「UTF-8 に変換」を実施した後の状態に 戻します。-noroundtripcheck
オプションが指定されていれば、 この処理は行いません。 - ローカルエンコーディングに変換
UTF-8 からローカルエンコーディングに変換します。 ローカルエンコーディングに変換できない文字を含むラベルについては、変換 せずに入力時点の状態に戻します。
- デリミタマッピング
- 結果を出力
行の内容を、変換結果として標準出力に出力します。