mdnconv
概要
mdnconvはネームサーバの設定ファイルnamed.conf
やゾーンマスタファイルのためのコードセット (エンコーディング) 変換ツールです。
mdnconvは引数で指定されたファイル、
あるいは標準入力からテキストを入力し、
mDNkitの設定ファイル (mdn.conf
) やオプションで指定されたエンコーディング変換および正規化を実行し、
結果を標準出力に書き出します。
具体的な使い方に関しては利用者ガイドのnamed.conf
、ゾーンマスタファイルの作成の項をご覧ください。
起動
mdnconvを起動する際の、コマンド行の形式は次の通りです。
% mdnconv [オプション...] [ファイル名...]
オプション
mdnconvのオプションには、
mDNkitの設定ファイル(mdn.conf
)のエントリと同じ設定機能を持っているものが多数あります。
設定ファイル内のエントリとオプションの両方を指定している場合、
その設定項目が複数回定義できるもの(例えばnameprep-map
エントリとそれに相当する -map
オプション)であれば、
指定は両方とも有効になります。
正確には、設定ファイルの定義内容がまず設定され、
オプションで指定した内容が追加されます。
また、設定項目が一つしか定義できないもの(例えばidn-encoding
とそれに相当する -out
オプション)については、
両方指定するとオプションの方が優先されます。
mdnconvが認識するオプションは、次の通りです。 よく使われると思われるオプションに関しては、 短縮形として1文字のオプションを用意してあります。
-
-in
<in-code>-i
<in-code> - 入力テキストのエンコーディングを指定します。 mDNkitのローカルエンコーディングに相当します。
-
-out
<out-code>-o
<out-code> -
出力テキストのコードセット名<out-code>を指定します。
mDNkitの設定ファイルの
idn-encoding
エントリに相当します。 -
-conf
<path>-c
<path> -
mDNkitの設定ファイル(
mdn.conf
)のパス名を指定します。 オプション-conf
、-noconf
のいずれも指定しなかった場合は、 デフォルトの設定ファイルを読み込みます。 -
-noconf
-C
-
mDNkitの設定ファイル(
mdn.conf
)を読み込まないようにします。 -
-reverse
-r
- 逆変換を行います。 このオプションを指定しなかった場合は、通常の変換を行います。
-
-nameprep
<version>-n
<version> -
NAMEPREPのバージョンを指定します。
mDNkitの設定ファイルの
nameprep
エントリに相当します。 このオプションは、-reverse
オプションが指定されたときは無視されます。 -
-nonameprep
-N
-
NAMEPREP処理を行いません。
このオプションは、
-reverse
オプションが指定されたときは無視されます。 -
-map
<scheme> -
NAMEPREPのマッピング方式を指定します。
mDNkitの設定ファイルの
nameprep-map
エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたときは無視されます。 -
-normalize
<scheme> -
NAMEPREPのマッピング方式を指定します。
mDNkitの設定ファイルの
nameprep-normalize
エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたときは無視されます。 -
-prohibit
<set> -
NAMEPREPの禁止文字検査における禁止文字を指定します。
mDNkitの設定ファイルの
nameprep-prohibit
エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたときは無視されます。 -
-unassigned
<set> -
NAMEPREPの未割り当て文字検査における未割り当て文字を指定します。
mDNkitの設定ファイルの
nameprep-unassigned
エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたとき、 あるいは-unassigncheck
が指定されなかったときは無視されます。 -
-unassigncheck
-u
-
NAMEPREPの未割り当て文字検査を行います。
このオプションを指定しなかった場合、検査は行いません。
-reverse
オプションが指定されたときは、 無視されます。 -
-delimiter
<codepoint> -
ピリオド(`
.
')以外にドメイン名の区切りと見なしたい文字を指定します。 mDNkitの設定ファイルのdelimiter-map
エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたとき、 あるいは-delimitermap
が指定されなかったときは無視されます。 -
-localmap
<map> -
NAMEPREPとは別に行う、ローカルなマッピングの方式を指定します。
mDNkitの設定ファイルの
local-map
エントリで、 トップレベルドメイン`.
'に対するマッピングを指定することに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたとき、 あるいは-nolocalmap
が指定されたときは無視されます。 -
-nolocalmap
-L
- ローカルなマッピングを行いません。
-
-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を実行し、 かつ出力エンコーディングがUTF-5やRACEなどASCII互換エンコーディングの場合に、 改行コードもUTF-5や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による正規化(マッピング、正規化、
禁止文字の検査) を行います。
ただし、
-nameprep
が指定されている場合、 この処理は飛ばします。 -
-unassigned
が指定されている場合は、 NAMEPREPによる未割り当てコードポイントの検査を行います。 - 再度変換結果がUTF-8として正しいエンコーディングであるかをチェックします。 本来この処理は不要なはずですが、 正規化の実装にバグがあった場合を考えてチェックを入れてあります。
-
UTF-8 エンコーディングから
-out
で指定された出力エンコーディングに変換します。 -
-whole
オプションが指定されていた場合には、 変換された文字列をそのまま標準出力に出力します。 指定されていなかった場合には、 変換された文字列と6.で処理対象とならなかった部分とをマージしてからやはり標準出力に出力します。 どちらの場合も最後に改行コードを出力します。 - すべての入力行を処理し終われば終了します。 そうでなければ1.に戻ります。