idnconv
概要
idnconv は国際化ドメイン名のエンコード、デコードを行うツールです。 idnconv は引数で指定されたファイル、あるいは標準入力からテキストを入力し、 idnkit の設定ファイルやオプションで指定されたエンコーディング変換および NAMEPREP を実行し、結果を標準出力に書き出します。
また、DNS サーバで国際化ドメイン名を扱うためには、サーバの設定ファイル
(BIND の named.conf
) やゾーンファイルのエンコーディング
を変換する必要があるのですが、idnconv を使うと容易に変換を行うことが
できます。(DNS サーバ関連のファイルの変換については、利用者ガイドの
DNSサーバの設定 に詳しく記してありますので、
そちらをご覧ください。)
便宜上ここでは、ローカルエンコーディングから IDN エンコーディング (通常は ACE) への変換を「エンコード」、IDN エンコーディングから ローカルエンコーディングへの変換 (逆変換) を「デコード」と呼ぶことに します。
起動
idnconv を起動する際の、コマンド行の形式は次の通りです。
% idnconv [オプション...] [ファイル名...]
なお、idnconv は 環境変数 IDN_DISABLE の設定を明示的に無視するため、 IDN_DISABLE が設定されているかどうかにかかわらず、ドメイン名の変換処理を 行います。
実行例
idnconv の実行例をいくつか示します。 まず、もっとも簡単な実行例は次のようになります。
% idnconv
この場合、(ファイル名が指定されていないので) idnconv は標準入力から データを読み込みます。 入力データのエンコーディングは、デフォルトのローカルエンコーディング とみなされ、エンコードの処理は標準の設定 (設定ファイルがあればその設定、 なければ idnkit の標準の設定) にしたがって行われます。
以下は、データを入力したときの様子です。一行入力すると、デコード結果が 標準出力に出力されます。この例では、出力エンコーディングは Punycode になっています。
% idnconv こんにちは.世界 zq--28j2a3ar1p.zq--rhqv96g こんばんは.皆 zq--28jwcc3lb.zq--jxy
EOF (通常はコントロール + D キー) を入力すると、idnconv は終了します。
ローカルエンコーディング、IDN エンコーディングを指定する場合は、
-in
および -out
オプションを指定します。
% idnconv -in EUC-JP -out Punycode
デコード (逆変換) を行う場合は、-reverse
オプションを
使います。
% idnconv -reverse zq--28j2a3ar1p.zq--rhqv96g こんにちは.世界 zq--28jwcc3lb.zq--jxy こんばんは.皆
デコード時にローカルエンコーディング、IDN エンコーディングを指定する場合は、
-in
および -out
に指定する値を逆にする必要が
ありますので、注意して下さい。
% idnconv -reverse -in Punycode -out EUC-JP
対話的に入力して変換するのではなく、ファイル全体を変換する場合は 次のように標準入力をファイルにリダイレクトするか、
% idnconv < filename
あるいは、ファイル名を idnconv の引数として与えるかします。
% idnconv filename
オプション
idnconv には、多数のオプションが用意されています。 ここではそのオプションについて、説明します。
idnconvのオプションには、idnkitの設定ファイルのエントリと同じ設定機能 を持っているものが幾つかあります。
設定ファイル内のエントリとオプションの両方を指定している場合、
その設定項目が複数回定義できるもの (例えば local-map
エントリとそれに相当する -localmap
オプション) であれば、指
定は両方とも有効になります。正確には、設定ファイルの定義内容がまず設定
され、オプションで指定した内容が追加されます。
また、設定項目が一つしか定義できないもの (例えば idn-encoding
とそれに相当する-out
オプション) については、両方指定する
とオプションの方が優先されます。
idnconv が認識するオプションは、次の通りです。 よく使われると思われるオプションに関しては、短縮形として1文字のオプション を用意してあります。
-
-in
<in-code>-i
<in-code> - 入力テキストのエンコーディングを指定します。
このオプションを指定しなかった場合のデフォルトのエンコーディングは
アプリケーションの
ローカルエンコーディング
になります。
ただし後述する
-reverse
オプションが指定されている場合には idnkit 設定ファイルのidn-encoding
エントリの設定がデフォルトとなります。 -
-out
<out-code>-o
<out-code> - 出力テキストのエンコーディング名 <out-code> を
指定します。
このオプションを指定しなかった場合のデフォルトのエンコーディングは
idnkit 設定ファイルの
idn-encoding
エントリに指定されたエンコーディングです。 ただし後述する-reverse
オプションが指定されている場合には アプリケーションの ローカルエンコーディング がデフォルトとなります。 -
-conf
<path>-c
<path> - idnkitの設定ファイルのパス名を指定します。
オプション
-conf
、-noconf
のいずれも指定しな かった場合は、デフォルトの設定ファイルを読み込みます。 -
-noconf
-C
- idnkitの設定ファイルを読み込まないようにします。
-
-reverse
-r
- デコード (逆変換) を行います。通常、idnconvはローカルエンコーディング のテキストを読み込み、NAMEPREP の後IDNエンコーディングに変換して出力しますが、 このオプションを指定した場合にはIDNエンコーディングのテキストを読み込み、 ローカルエンコーディングに変換して出力するという動作になります。
-
-nameprep
<version>-n
<version> - NAMEPREP のバージョンを指定します。
idnkit の設定ファイルの
nameprep
エントリ に相当します。 -
-nonameprep
-N
- NAMEPREP 処理を行いません。
このオプションは
-nounassigncheck
の効果も合わせ持っています。 -
-nounassigncheck
-U
- NAMEPREP の未割り当て文字検査を行わないようにします。
-
-nolengthcheck
- ラベルの文字数検査を行わないようにします。
-reverse
オプションが指定されたときは無視されます。 -
-noasciicheck
-A
- ASCII 文字に関する検査を行わないようにします。
-
-nobidicheck
-B
- 双方向文字列の検査を行わないようにします。
-
-roundtripcheck
- ラウンドトリップチェックを行わないようにします。
-reverse
オプションが指定されていないときは無視されます。 -
-delimiter
<codepoint> - ピリオド (`
.
') 以外にドメイン名のデリミタと見なしたい 文字を指定します。 このオプションは複数回指定することが可能です。 -
-localmap
<map> - NAMEPREP とは別に行う、ローカルなマッピングの方式を指定します。
idnkit の設定ファイルの
local-map
エントリで、トップレベルドメイン `.
' に対するマッピング を指定することに相当します。 このオプションは複数回指定することが可能ですが、-reverse
オプションが指定されたとき、あるいは-nolocalmap
が指定 されたときは無視されます。 -
-nolocalmap
-L
- ローカルなマッピングを行いません。
-reverse
オプションが指定されたときは無視されます。 -
-whole
-w
- 読み込んだ行全体を、1 つのドメイン名とみなして処理します。 このオプションを指定しなければ、国際化ドメイン名だと判断された部分のみ が変換対象となります。
-
-alias
path-a
path - エンコーディング名のエイリアスファイルを指定します。
-
-flush
- 行ごとに出力をフラッシュします。idnconv はファイルやパイプへの 出力の場合、通常は複数行のデータをまとめて書き出しますが、この オプションを指定すると1行ごとに変換結果を書き出します。 通常はこのオプションを指定する必要はありませんが、 idnconv をフィルタプログラムとして他のプログラムから利用する場合などに 便利なことがあります。
-
-version
-v
- バージョン情報を表示して実行を終了します。 idnconv のバージョンと、ライブラリ (libidn) のバージョンを表示します。 両者は通常同一のはずですが、共有ライブラリを使っている場合には 違っていることがあるかもしれません。
変換処理
エンコードの処理
idnconv のエンコード (-reverse
オプション無指定時の動作)
では、入力データに対して一行ずつ次のような処理を行います。
- 入力行の読み込み
ファイルあるいは標準入力から 1 行分のデータを読み込みます。 - UTF-8 に変換
入力行をローカルエンコーディングから UTF-8 に変換します。 - 国際化ドメイン名が書かれた部分の検出
-whole
(または-w
) オプションが指定された 場合は、入力行全体を 1 つのドメイン名とみなします。指定されていない 場合は、国際化ドメイン名とみなせる部分一つずつ取り出します。 - 国際化ドメイン名を IDN エンコーディングに変換
取り出した個々の国際化ドメイン名を、IDN エンコーディング (通常は ACE) に変換します。処理の詳細は次の通りです。- デリミタマッピング
設定されているデリミタ (区切り文字) をピリオドに変換します。 - ローカルマッピング
取り出した個々の国際化ドメイン名に対して、ローカルなマッピングを行います。 - NAMEPREP
NAMEPREP を行います。 禁止文字や未割り当てコードポイントが含まれていたり、双方向文字列チェッ クでエラーとなった場合には、エラーを出力して処理を中止します。 - ASCII 文字の検査
ASCII 文字に関する検査を行います。先頭か末尾にハイフンが来ているラベル、 もしくは英数字やハイフン以外の ASCII 文字を含んだラベルがあった場合は、 エラーを出力して処理を中止します。 - IDN エンコーディングに変換
UTF-8 から IDN エンコーディング (通常は ACE) に変換します。 - 文字数の検査
ドメイン内の各ラベルの文字数を調べ、空のラベルや 64 文字以上のラベルが あれば、エラーを出力して処理を中止します。
- デリミタマッピング
- 結果を出力
行の内容を、変換結果として標準出力に出力します。
ただし、特定の処理を抑止するオプションを指定していると、該当する処理
は行われません。たとえば、-nonameprep
オプションを指定
されていれば、NAMEPREP は行われません。
デコードの処理
idnconv のデコード (-reverse オプション指定時の動作、逆変換) は エンコードと似ていますが、処理は対称をなしていません。 入力データに対して一行ずつ次のような処理を行います。
- 入力行の読み込み
ファイルあるいは標準入力から 1 行分のデータを読み込みます。 - UTF-8 に変換
入力行をローカルエンコーディングで記述されているとみなして、UTF-8 に 変換します。 - 国際化ドメイン名が書かれた部分の検出
-whole
(または-w
) オプションが指定された場合は、 入力行全体を 1 つのドメイン名とみなします。指定されていない場合は、 入力行の中で (IDN エンコーディングで表現されたものを含めて) 正しい ドメイン名とみなせるものを、すべて国際化ドメイン名として取り出します。 - 国際化ドメイン名をローカルエンコーディングに変換
取り出した個々の国際化ドメイン名を、デコードしてローカルエンコーディング に変換します。処理の詳細は次の通りです。- デリミタマッピング
IDNA で指定されているデフォルトのセパレータと、その他に設定されてい るデリミタ (区切り文字) をピリオドに変換します。 - NAMEPREP
NAMEPREP を行います。 禁止文字や未割り当てコードポイントを含んでいたり、 双方向文字列チェックでエラーとなってしまうラベルは、 入力時点の状態に戻し、そのラベル対する変換処理は 一切行わないようにします。 - UTF-8 に変換
IDN エンコーディング (通常は ACE) から UTF-8 に変換します。 - ラウンドトリップチェック
前項で UTF-8 に変換する前のドメイン名が、正しく NAMEPREP や IDN エンコーディングへの変換が行われてたものかどうか調べます。 正しく行われていなかったラベルは、入力時点の状態に戻し、そのラベルに 対する変換処理は一切行わないようにします。 - ローカルエンコーディングに変換
UTF-8 からローカルエンコーディングに変換します。 ローカルエンコーディングに変換できない文字を含むラベルについては、変換 せずに入力時点の状態に戻します。
- デリミタマッピング
- 結果を出力
行の内容を、変換結果として標準出力に出力します。
ただし、特定の処理を抑止するオプションを指定していると、該当する処理 は行われません。