# mdnconv

## 概要

mdnconv はネームサーバの設定ファイル `named.conf` や ゾーンマスタファイルのためのコードセット (エンコーディング) 変換ツールです。

mdnconv は引数で指定されたファイル、あるいは標準入力から テキストを入力し、オプションで指定されたコードセット変換および正規化を 実行し、結果を標準出力に書き出します。

具体的な使い方に関しては利用者ガイドの `named.conf`、 ゾーンマスタファイルの作成の項をご覧ください。

## 起動

>     % mdnconv [オプション...]  [ファイル...]

## オプション

-in in-code
  入力テキストのコードセット名 in-code を指定します。 in-code に指定できるコードセット名は、次のいずれかです。
  - iconv_open() が受け付けるコードセット名
  - `UTF-5`
  - `RACE`
  - `BRACE`
  - `LACE`
  - 上記のコードセット名の別名 (-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
  個々の正規化方式については MDN ライブラリの normalizer モジュールをご覧ください。

  このオプションは複数指定することが可能です。複数指定した場合には、 指定した順に正規化が行われます。

  このオプションを指定しなかった場合には クライアント設定ファイルの 正規化エントリに 指定されている正規化方式が使用されます。

-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. ファイルあるいは標準入力からテキストを1行読み込みます。

2. 行末の改行コードを取り除きます。 これは -whole オプションをつけて mdnconv を実行し、かつ 出力エンコーディングが UTF-5 や RACE など ASCII 互換 エンコーディングの場合に、改行コードも UTF-5 や RACE で エンコードされてしまい、改行がなくなってしまうのを避けるためです。

3. 行を UTF-8 エンコーディングに変換します。変換には MDN ライブラリの converter モジュール を使用します。

   通常は行全体を UTF-8 に変換しますが、入力コードセットが "RACE" の場合には、RACE エンコーディングを識別するプリフィックスを用いて RACE エンコードされた部分のみを取り出して UTF-8 に変換します。

4. 変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。 これには MDN ライブラリの utf8 モジュール を使用します。本来この処理は不要なはずですが、コード変換の実装に バグがあった場合に早い段階で検出できるよう、ここでチェックをするように してあります。

5. -whole オプションが指定されていれば次の処理対象の取り出しを飛ばし、 行全体を処理対象として 7. に飛びます。

6. UTF-8に変換された行の中から多言語ドメイン名の部分を取り出します。 これには MDN ライブラリの selectiveencode モジュール を使用します。取り出されるのは次のような部分文字列です。
   - 1文字以上の非ASCII文字を含むこと。
   - 従来のドメイン名に許される文字 (アルファベット、数字、ハイフン)、 非ASCII文字、ピリオドだけから構成されていること

   取り出された部分のみを以降の正規化等の処理対象とします。

7. 正規化を行います。 これには MDN ライブラリの normalizer モジュール を使用します。

8. 再度変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。 本来この処理は不要なはずですが、正規化の実装に バグがあった場合を考えてチェックを入れてあります。

9. 正規化された文字列の最後がピリオドで終わっており、かつ -zld オプションで指定された ZLD と文字列がマッチすれば、ZLD の部分を 次のコードセット変換の対象から外します。これは ZLD の部分まで (UTF-5 などに) 変換されてしまうのを防ぐためです。

10. UTF-8 エンコーディングから -out で指定された出力エンコーディングに 変換します。変換には MDN ライブラリの converter モジュール を使用します。

11. 出力エンコーディングに変換する前の文字列がピリオドで終わっており、 かつ -auto オプションが指定されていれば、文字列の後に ZLD を付加します。

12. -whole オプションが指定されていた場合には変換された文字列をそのまま 標準出力に出力します。 指定されていなかった場合には、変換された文字列と 6. で処理対象と ならなかった部分とをマージしてからやはり標準出力に出力します。 どちらの場合も最後に改行コードを出力します。

13. すべての入力行を処理し終われば終了します。そうでなければ 1. に 戻ります。