mdnconv
概要
mdnconv はネームサーバの設定ファイル named.conf や ゾーンマスタファイルのためのコードセット (エンコーディング) 変換ツールです。
mdnconv は引数で指定されたファイル、あるいは標準入力から テキストを入力し、オプションで指定されたコードセット変換および正規化を 実行し、結果を標準出力に書き出します。
具体的な使い方に関しては利用者ガイドの named.conf、 ゾーンマスタファイルの作成の項をご覧ください。
起動
% mdnconv [オプション...] [ファイル...]
オプション
- -in in-code
- 入力テキストのコードセット名 in-code を指定します。
in-code に指定できるコードセット名は、次のいずれかです。
- iconv_open() が受け付けるコードセット名
- UTF-5
- RACE
- BRACE
- LACE
- DUDE
- UTF-6
- 上記のコードセット名の別名 (-alias オプション参照)
指定しなかった場合には現在のロケールからデフォルトのコードセットを 求めます。
- -out out-code
- 出力テキストのコードセット名 out-code を指定します。
out-code に指定できるコードセット名は
-in オプションの in-code と同じです。
指定しなかった場合には クライアント設定ファイルの サーバエンコーディングエントリ に設定されているコードセットが使用されます。
- -normalize scheme
- 正規化の方式を指定します。schemeに指定できる方式は
次のいずれかです。
- ascii-uppercase
- ascii-lowercase
- unicode-uppercase
- unicode-lowercase
- unicode-form-c
- unicode-form-kc
- ja-kana-fullwidth
- ja-alnum-halfwidth
- ja-compose-voiced-sound
- ja-minus-hack
- ja-delimiter-hack
このオプションは複数指定することが可能です。複数指定した場合には、 指定した順に正規化が行われます。
このオプションを指定しなかった場合には クライアント設定ファイルの 正規化エントリに 指定されている正規化方式が使用されます。
- -zld ZLD
- 使用する ZLD を指定します。変換されるドメイン名が
ピリオドで終わる FQDN で、かつ最後が ZLD と
一致した場合には、一致した部分は変換対象から外されます。
これは UTF-5 など一部の ASCII互換エンコーディングにおいて、ZLD 部分が
変換されないようにするためにするために必要な処理です。
このオプションを指定しなかった場合には クライアント設定ファイルの サーバ ZLD エントリに 指定されている値が使用されます。
- -auto
-
-zld オプションと組み合わせて使用します。
もし変換対象である、非ASCII文字を含むドメイン名の最後が
ピリオドで終わっていた場合に、-zld オプションで指定した ZLD
がそのあとに自動的に付加されます。
これによってゾーンマスタファイル等に ZLD を明示的に書く必要が
少なくなりますが、この補完機能は完全ではないので、明示的に ZLD を
書かなければならない場合もあります。一般的にはこの機能に
頼らない方がよいでしょう。
- -whole
- 正規化とターゲットコードセットへの変換を
入力されたテキスト全体に対して行います。このオプションを指定しなければ
非ASCII文字を含むドメイン名だと判断された部分のみが変換対象と
なります。詳細は変換処理の詳細をご覧ください。
- -alias path
- コードセット名の別名を定義したファイル path を指定します。
このファイルはテキストファイル形式で、1行に一組ずつ
コードセット名の別名と正式名とを一つ以上のスペースで区切って書いた
ものです。例えば次の例は Shift_JIS と EUC-JP の
別名としてそれぞれ sjis、euc-jp を定義するものです。
# "#" で始まる行はコメント sjis Shift_JIS euc-jp EUC-JP
- -noconf
-
クライアント設定ファイルを
読み込まないようにします。
- -flush
- 行ごとに出力をフラッシュします。mdnconv はファイルやパイプへの 出力の場合、通常は複数行のデータをまとめて書き出しますが、この オプションを指定すると1行ごとに変換結果を書き出します。 通常はこのオプションを指定する必要はありませんが、 mdnconv をフィルタプログラムとして他のプログラムから利用する場合などに 便利なことがあります。
変換処理の詳細
mdnconv が行う変換処理をステップごとに記述します。
- ファイルあるいは標準入力からテキストを1行読み込みます。
- 行末の改行コードを取り除きます。
これは -whole オプションをつけて mdnconv を実行し、かつ
出力エンコーディングが UTF-5 や RACE など ASCII 互換
エンコーディングの場合に、改行コードも UTF-5 や RACE で
エンコードされてしまい、改行がなくなってしまうのを避けるためです。
- 行を UTF-8 エンコーディングに変換します。変換には
MDN ライブラリの converter モジュール
を使用します。
通常は行全体を入力エンコーディングから UTF-8 に変換しますが、
入力コードセットが "RACE" などの ASCII 互換エンコーディング (ACE) の
場合、この方法では入力行中にスペース等 ACE には含まれない文字が
入っていると変換できずにエラーになってしまうため、次のような特別な
処理を行います。
- 行の中から正しい ASCII ドメイン名と解釈できる部分文字列 (つまり 英数字とハイフン、ピリオドだけから構成される部分) を取り出す。
- それぞれを入力 ACE エンコーディングから UTF-8 に変換してみる。
- 変換に成功すればその部分文字列を変換結果で置き換え、 変換に失敗すれば (例えば変換対象文字列がその ACE 特有のプリフィックス やサフィックスを持たない場合) その部分は置き換えず、元の文字列のままとする。
- 変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。
これには MDN ライブラリの utf8 モジュール
を使用します。本来この処理は不要なはずですが、コード変換の実装に
バグがあった場合に早い段階で検出できるよう、ここでチェックをするように
してあります。
- -whole オプションが指定されていれば次の処理対象の取り出しを飛ばし、
行全体を処理対象として 7. に飛びます。
- UTF-8に変換された行の中から多言語ドメイン名の部分を取り出します。
これには MDN ライブラリの
selectiveencode モジュール
を使用します。取り出されるのは次のような部分文字列です。
- 1文字以上の非ASCII文字を含むこと。
- 従来のドメイン名に許される文字 (アルファベット、数字、ハイフン)、 非ASCII文字、ピリオドだけから構成されていること
取り出された部分のみを以降の正規化等の処理対象とします。
- 正規化を行います。
これには MDN ライブラリの
normalizer モジュール
を使用します。
- 再度変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。
本来この処理は不要なはずですが、正規化の実装に
バグがあった場合を考えてチェックを入れてあります。
- 正規化された文字列の最後がピリオドで終わっており、かつ
-zld オプションで指定された ZLD と文字列がマッチすれば、ZLD の部分を
次のコードセット変換の対象から外します。これは ZLD の部分まで
(UTF-5 などに) 変換されてしまうのを防ぐためです。
- UTF-8 エンコーディングから -out で指定された出力エンコーディングに
変換します。変換には
MDN ライブラリの converter モジュール
を使用します。
- 出力エンコーディングに変換する前の文字列がピリオドで終わっており、
かつ -auto オプションが指定されていれば、文字列の後に ZLD を付加します。
- -whole オプションが指定されていた場合には変換された文字列をそのまま
標準出力に出力します。
指定されていなかった場合には、変換された文字列と 6. で処理対象と
ならなかった部分とをマージしてからやはり標準出力に出力します。
どちらの場合も最後に改行コードを出力します。
- すべての入力行を処理し終われば終了します。そうでなければ 1. に 戻ります。