mdnconv
概要
mdnconvはネームサーバの設定ファイル named.conf
や
ゾーンマスタファイルのためのコードセット (エンコーディング) 変換ツールです。
mdnconvは引数で指定されたファイル、あるいは標準入力からテキストを入力し、
mDNkit の設定ファイル (mdn.conf
) やオプションで指定された
エンコーディング変換および正規化を実行し、結果を標準出力に書き出します。
具体的な使い方に関しては利用者ガイドの
named.conf
、
ゾーンマスタファイルの作成の項をご覧ください。
なお、mdnconv は 環境変数 MDN_DISABLE の設定を明示的に無視するため、 MDN_DISABLE が設定されているかどうかにかかわらず、ドメイン名の変換処理を 行います。
起動
mdnconv を起動する際の、コマンド行の形式は次の通りです。
% mdnconv [オプション...] [ファイル名...]
オプション
mdnconvのオプションには、mDNkitの設定ファイル (mdn.conf
)
のエントリと同じ設定機能を持っているものが多数あります。
設定ファイル内のエントリとオプションの両方を指定している場合、
その設定項目が複数回定義できるもの (例えば nameprep-map
エントリとそれに相当する -map
オプション) であれば、指
定は両方とも有効になります。正確には、設定ファイルの定義内容がまず設定
され、オプションで指定した内容が追加されます。
また、設定項目が一つしか定義できないもの (例えば idn-encoding
とそれに相当する-out
オプション) については、両方指定する
とオプションの方が優先されます。
mdnconv が認識するオプションは、次の通りです。 よく使われると思われるオプションに関しては、短縮形として1文字のオプション を用意してあります。
-
-in
<in-code>-i
<in-code> - 入力テキストのエンコーディングを指定します。
このオプションを指定しなかった場合のデフォルトのエンコーディングは
アプリケーションの
ローカルエンコーディング
になります。
ただし後述する
-reverse
オプションが指定されている場合には mDNkit 設定ファイルのidn-encoding
エントリの設定がデフォルトとなります。 -
-out
<out-code>-o
<out-code> - 出力テキストのコードセット名 <out-code> を指定します。
このオプションを指定しなかった場合のデフォルトのエンコーディングは
mDNkit 設定ファイルの
idn-encoding
エントリに指定されたエンコーディングです。 ただし後述する-reverse
オプションが指定されている場合には アプリケーションの ローカルエンコーディング がデフォルトとなります。 -
-conf
<path>-c
<path> - mDNkitの設定ファイル (
mdn.conf
) のパス名を指定します。 オプション-conf
、-noconf
のいずれも指定しな かった場合は、デフォルトの設定ファイルを読み込みます。 -
-noconf
-C
- mDNkitの設定ファイル (
mdn.conf
) を読み込まないようにします。 -
-reverse
-r
- 逆変換を行います。通常、mdnconvはローカルエンコーディングの テキストを読み込み、正規化の後IDNエンコーディングに変換して出力しますが、 このオプションを指定した場合にはIDNエンコーディングのテキストを読み込み、 ローカルエンコーディングに変換して出力するという動作になります。
-
-nameprep
<version>-n
<version> - NAMEPREP のバージョンを指定します。
mDNkit の設定ファイルの
nameprep
エントリ に相当します。 -
-nonameprep
-N
- NAMEPREP 処理を行いません。
-
-map
<scheme> - NAMEPREP のマッピング方式を指定します。
mDNkit の設定ファイルの
nameprep-map
エントリに相当します。 このオプションは複数回指定することが可能です。 -
-normalize
<scheme> - NAMEPREP のマッピング方式を指定します。
mDNkit の設定ファイルの
nameprep-normalize
エントリに相当します。 このオプションは複数回指定することが可能です。 -
-prohibit
<set> - NAMEPREP の禁止文字検査における禁止文字を指定します。
mDNkit の設定ファイルの
nameprep-prohibit
エントリに相当します。 このオプションは複数回指定することが可能です。 -
-unassigned
<set> - NAMEPREP の未割り当て文字検査における未割り当て文字を指定します。
mDNkit の設定ファイルの
nameprep-unassigned
エントリに相当します。 このオプションは複数回指定することが可能ですが、-unassigncheck
が指定されなかったときは無視されます。 -
-unassigncheck
-u
- NAMEPREP の未割り当て文字検査を行います。このオプションを指定しなかった 場合、検査は行いません。
-
-delimiter
<codepoint> - ピリオド (`
.
') 以外にドメイン名の区切りと見なしたい 文字を指定します。 mDNkit の設定ファイルのdelimiter-map
エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたとき、あるいは-delimitermap
が指定 されなかったときは無視されます。 -
-localmap
<map> - NAMEPREP とは別に行う、ローカルなマッピングの方式を指定します。
mDNkit の設定ファイルの
local-map
エントリで、トップレベルドメイン `.
' に対するマッピング を指定することに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたとき、あるいは-nolocalmap
が指定 されたときは無視されます。 -
-nolocalmap
-L
- ローカルなマッピングを行いません。
-reverse
オプションが指定されたときは無視されます。 -
-delimitermap
-d
- ピリオド (`
.
') 以外の文字を、ピリオドにマッピングし ます。このオプションを指定しなければ、通常このマッピングは行いません。-reverse
オプションが指定されたときは、無視されます。 -
-whole
-w
- 正規化とターゲットコードセットへの変換を 入力されたテキスト全体に対して行います。このオプションを指定しなければ 非ASCII文字を含むドメイン名だと判断された部分のみが変換対象と なります。詳細は変換処理の詳細をご覧ください。
-
-alias
path-a
path - エンコーディング名の別名を定義します。
mDNkit の設定ファイルの
encoding-alias-file
エントリに相当します。 -
-flush
- 行ごとに出力をフラッシュします。mdnconv はファイルやパイプへの 出力の場合、通常は複数行のデータをまとめて書き出しますが、この オプションを指定すると1行ごとに変換結果を書き出します。 通常はこのオプションを指定する必要はありませんが、 mdnconv をフィルタプログラムとして他のプログラムから利用する場合などに 便利なことがあります。
-
-version
-v
- バージョン情報を表示して実行を終了します。 mdnconv のバージョンと、ライブラリ (libmdn) のバージョンを表示します。 両者は通常同一のはずですが、共有ライブラリを使っている場合には 違っていることがあるかもしれません。
変換処理の詳細
mdnconv が行う変換処理をステップごとに記述します。
- ファイルあるいは標準入力からテキストを1行読み込みます。
- 行末の改行コードを取り除きます。
これは
-whole
オプションをつけて mdnconv を実行し、かつ 出力エンコーディングが Punycode や RACE など ASCII 互換 エンコーディングの場合に、改行コードも Punycode や RACE で エンコードされてしまい、改行がなくなってしまうのを避けるためです。 - 行を UTF-8 エンコーディングに変換します。
通常は行全体を入力エンコーディングから UTF-8 に変換しますが、
入力コードセットが "RACE" などの ASCII 互換エンコーディング (ACE) の
場合、この方法では入力行中にスペース等の ACE には含まれない文字が
入っていると変換できずにエラーになってしまうため、次のような特別な
処理を行います。
- 行の中から正しい ASCII ドメイン名と解釈できる部分文字列 (つまり 英数字とハイフン、ピリオドだけから構成される部分、ただし先頭は英数字 のみ、末尾はハイフン以外の文字) を取り出す。
- それぞれを入力 ACE エンコーディングから UTF-8 に変換してみる。
- 変換に成功すればその部分文字列を変換結果で置き換え、 変換に失敗すれば (例えば変換対象文字列がその ACE 特有のプリフィックス やサフィックスを持たない場合) その部分は置き換えず、元の文字列のままとする。
- 変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。 本来この処理は不要なはずですが、コード変換の実装にバグがあった場合に早い 段階で検出できるよう、ここでチェックをするようにしてあります。
-
-whole
オプションが指定されていれば次の処理対象の取り出し を飛ばし、行全体を処理対象として 7. に飛びます。 - UTF-8に変換された行の中から多言語ドメイン名の部分を取り出します。
取り出されるのは次のような部分文字列です。
- 1文字以上の非ASCII文字を含むこと。
- 従来のドメイン名に許される文字 (アルファベット、数字、ハイフン)、 非ASCII文字、ピリオドだけから構成されていること
-
-delimitermap
が指定されている場合は、設定されている 区切り文字をピリオド (`.
') に変換します。 - ローカルなマッピングを行います。
ただし、
-nolocalmap
が指定されている場合、この処理は飛ばします。 - NAMEPREP による正規化 (マッピング、正規化、禁止文字の検査) を行います。
もし禁止文字が含まれていた場合にはエラーを出力して処理を中止します。
-nonameprep
が指定されている場合、この処理は飛ばします。 -
-unassigncheck
が指定されている場合は、 NAMEPREP による未割り当てコードポイントの検査を行います。 未割り当てのコードポイントが含まれていれば、エラーを出力して処理を中止します。 - 再度変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。 本来この処理は不要なはずですが、正規化の実装に バグがあった場合を考えてチェックを入れてあります。
- UTF-8 エンコーディングから
-out
で指定された出力 エンコーディングに変換します。 -
-whole
オプションが指定されていた場合には、 変換された文字列をそのまま標準出力に出力します。 指定されていなかった場合には、変換された文字列と 6. で処理対象と ならなかった部分とをマージしてからやはり標準出力に出力します。 どちらの場合も最後に改行コードを出力します。 - すべての入力行を処理し終われば終了します。そうでなければ 1. に 戻ります。
以上は順方向の変換処理について述べたものです。
-reverse
オプションにより
逆変換を指定した場合にはいくつかのステップの処理が異なります。
逆変換で処理が変わるステップは次の通りです。
- この処理は実行されません。
- この処理は実行されません。
- NAMEPREP による正規化を実行する代りに、 名前がすでに正規化済みであるかどうかの検査を行います。 もし正規化されておらず、かつ入力エンコーディングがACEの場合には ステップ 12. の際に出力エンコーディングに変換するのではなく、 入力エンコーディングに戻します。
-
-unassigncheck
が指定されている場合は、 NAMEPREP による未割り当てコードポイントの検査を行います。 未割り当てのコードポイントが含まれており、かつ入力エンコーディングが ACEの場合には、 ステップ 12. の際に出力エンコーディングに変換するのではなく、 入力エンコーディングに戻します。