idnkitの設定
- はじめに
- 設定ファイルの必要性
- 設定ファイルなしでの動作
- デフォルト設定ファイル
- 設定ファイルの内容
- ローカルエンコーディングについて
- エイリアスファイルについて
- マップファイルの形式について
- セットファイルの形式について
- 環境変数について
はじめに
idnkit が提供するアプリケーションのうち、 idnconv, idn wrapper, runidn, BIND パッチを適用した dig, nslookup, host は共通の設定ファイルが存在した場合、それを参照します。 ただし、設定ファイルが存在しない場合は標準的な設定 が自動的に行われます。 そのため、現在の idnkit では、ドメイン名変換を行うのに設定ファイルの 用意が必須というわけではありません。
実際の使用時に設定ファイルが必要かどうかの判断については、 設定ファイルの必要性 と 設定ファイルなしでの動作 を参照してください。また、 自動的に読み込まれる設定ファイルのパス名については デフォルト設定ファイル を参照してください。
設定ファイルの内容の具体的な形式については、 設定ファイルの内容 を参照してください。
アプリケーションの使用するローカルエンコーディングは アプリケーションの動作するロケール情報から取得します。これについても 合わせて説明します。
- 設定ファイルの必要性
- 設定ファイルなしでの動作
- デフォルト設定ファイル
- 設定ファイルの内容
- ローカルエンコーディングについて
- エイリアスファイルについて
- マップファイルの形式について
- セットファイルの形式について
- 環境変数について
設定ファイルの必要性
設定ファイルには、idnkit を利用したクライアントが必要とする いくつかの情報を設定することができます。 例えば NAMEPREP の方式や、 DNS プロトコル上で用いられるドメイン名の エンコーディング方法などをこのファイルで指定します。 具体的には以下のような項目を設定できます。
- DNS プロトコル上のドメイン名のエンコーディング (IDN エンコーディング)
- NAMEPREP
- 特定の言語やトップレベルドメイン固有の正規化形式
しかし、設定ファイルが存在しない場合でも、現在の idnkit は動作します。 ここでは、どのような場合に設定ファイルが必要となるかを、 例をあげて説明します。 設定を行う際に参考にしてください。
IDN エンコーディングを指定したい場合
IDN エンコーディング自体の説明については、 idnkit 概要説明 の エンコーディング変換 を参照してください。
設定ファイルなしでの動作
時には、使用される IDN エンコーディングは Punycode
となります。
IDN エンコーディングの設定方法については、
設定ファイルの内容
の
idn-encoding
項を参照して下さい。
NAMEPREP を指定したい場合
NAMEPREP については、 idnkit 概要説明 の NAMEPREP を参照してください。
設定ファイルなしでの動作 時には、使用される NAMEPREP は「現在 idnkit がサポートしている最新の NAMEPREP」となります。
そうではなく、以前の NAMEPREP を指定したい場合は設定ファイルで 指定します。
なお、どう設定すればよいかよくわからない場合には、 最新バージョンを使用して下さい。
NAMEPREP の設定方法については、
設定ファイルの内容
の
nameprep
項を参照して下さい。
ローカルマップを指定したい場合
まず、NAMEPREP について、その意味がわからない場合は idnkit 概要説明 の NAMEPREP を参照してください。
ローカルマップ処理は NAMEPREP の前に実行され、NAMEPREP では行われない ドメイン名の正規化が必要な場合に設定されます。
たとえば、「-」(U+2212, MINUS SIGN) という文字は `-' (U+002D, HYPHEN MINUS) と同じ文字と思われがちですが、 両者に対して NAMEPREP を適用しても結果は一致しません。 (NAMEPREP を適用しても、両者とも結果は適用前と変わりません。)
結果が一致しないということは、国際化ドメイン名として入力された場合に ついても、両者は一致しないということを意味します。 欧米で使用される ISO 8859-1 や ASCII といった文字エンコーディング では U+002D のほうしか含まれていないため、問題はほとんど起きません。 けれども、EUC-JP やシフトJIS といった日本語でよく用いられる 文字エンコーディングでは両方の文字が含まれているため、この問題が しばしば顕在化します。
このように NAMEPREP だけでは意図した結果にならなくて不便だという場合
に、ローカルマップでマッピング規則を補うことができます。
上記の「-」の問題では、まず以下のようなマップファイル
(minus-sign.map
とします) を用意します。
# 「-」(U+2212) を `-' (U+002D) にマッピングする。 2212; 002D;
そして、このマップファイル を設定ファイルの local-map
エントリ
で次のように指定します。ただし、パスの部分は、実際のマップファイルへの
パスを指定してください。
local-map .jp filemap:/some/where/minus-sign.map
上の設定例では、入力された国際化ドメイン名のトップレベルドメインが
.jp
の場合に限り、「-」(U+2212, MINUS SIGN) を `-'
(U+002D, HYPHEN MINUS) に変換します。
ローカルマップの設定方法については、
設定ファイルの内容
の
local-map
項を参照して下さい。
また、マップファイルの書き方について詳しくは、
マップファイルの形式について
を参照して下さい。
設定ファイルなしでの動作
設定ファイルが存在しない場合、標準的な設定が自動的に行われます。 具体的には、
- idnkit のサポートする最新の NAMEPREP
- IDN エンコーディングに
Punycode
を指定する
以上の設定が行われます。
デフォルト設定ファイル
デフォルト設定ファイルの読み込み時には、以下の二種類のファイルのうち どちらかが読み込まれます。
- ユーザの設定ファイル
- システムの設定ファイル
前者が存在した場合、後者は読み込まれません。
UNIX 環境では、次のファイルがデフォルトの設定ファイルとなります。
- ユーザの設定ファイル
- ユーザのホームディレクトリの
.idnrc
- システムの設定ファイル
-
SYSCONFDIR
ディレクトリの下のidn.conf
。 (SYSCONFDIR
は、idnkit をインストールする際にconfigure
の --prefix オプション や --sysconfdir オプション で決定されます。)
Windows では、設定ファイルの場所はレジストリに記録されています。
なお、デフォルト設定ファイルの読み込み時に設定ファイルが存在しない場合、 idnkit は標準的な設定 を自動的に行います。そのため、設定ファイルは必須ではありません。 「標準的な設定」の詳細については 設定ファイルなしでの動作 を参照してください。
設定ファイルの内容
idnkit の設定ファイルは通常のテキストファイルで、ファイルの 各行 (# で始まるコメント行と、空行を除いて) は、次のような単純な フォーマットで構成されます。
キーワード 値 ...
idn-encoding
リソルバや DNS サーバによって使用される、国際化ドメイン名の エンコーディングを指定します。
[構文]
idn-encoding
<encoding>
<encoding>として、次の名称が指定できます。
Punycode
- あなたのシステムの
iconv_open()
が認識するエンコーディング名。- エイリアスファイルで定義された、上記のエンコーディング名のエイリアス (エイリアスファイルについて を参照のこと)
[設定例]
idn-encoding Punycode
idn-encoding
が設定ファイル中に指定されなかった場合は、
Punycode
が指定されたものとみなします。
なお、アプリケーション側のローカルエンコーディングはロケールや環境変数 によって決まるので、client-encoding というエントリはありません。 ローカルエンコーディングに関しては後述します。
nameprep
国際化ドメイン名の正規化、禁止文字の検出方法などを定めたものとして NAMEPREP があります。 このエントリでは、どのバージョンの NAMEPREP を使用するのかを指定し ます。
[構文]
nameprep
<version>
<version>には以下のものが指定できます。
nameprep-03
- インターネットドラフト draft-ietf-idn-nameprep-03.txt に対応した NAMEPREP の方式。
nameprep-10
- インターネットドラフト draft-ietf-idn-nameprep-10.txt に対応した NAMEPREP の方式。
nameprep-11
- インターネットドラフト draft-ietf-idn-nameprep-11.txt に対応した NAMEPREP の方式。
[設定例]
nameprep nameprep-11
NAMEPREP の処理手順は、次の 4 つの工程で構成されます。
- マッピング (mapping)
- 正規化 (normalization)
- 使用禁止文字 (prohibited character check)
- 未割り当てコードポイントの検出 (unassigned codepoint check)
nameprep
が設定ファイル中に指定されなかった場合は、
idnkit が対応している NAMEPREP バージョンの内で最新のものが指定された
ものとみなします。
local-map
このエントリは、NAMEPREP を適用する前のドメイン名に対して行う、 ローカルなマッピングを指定します。 このマッピングは、ドメイン名のトップレベルドメイン (TLD) 毎に異なる ものを指定することができます。
[構文]
local-map
<TLD> <scheme> ...
<TLD> には、マッピングを適用する TLD を、 <scheme> にはマッピングの方式の名称をそれぞれ指定 します。 2 つ以上の方式が指定された場合は、順番通りに (左から右に) 適用します。 <scheme>には、以下のものが指定できます。
- <version>
- NAMEPREP の特定のバージョンにしたがったマッピング。 指定可能なバージョン番号については、
nameprep
の項を参照してください。filemap:
<pathname>- マッピングの定義を <pathname>ファイルから読み込みます。 ファイルの記述方法については、 マップファイルの形式の項を参照してください。
[設定例]
local-map .jp filemap:/some/where/jp.map local-map - filemap:/some/where/notld.map local-map . filemap:/some/where/default.map
TLD としてハイフン (`-
') を指定すると、TLDがないドメイン
名、言い換えるとピリオド(`.
')を含んでいないドメイン名に
対して適用するマッピングを指定したことになります。
同様に、TLD としてピリオドを指定すると、他のlocal-map
エントリの TLD のいずれとも一致しないドメイン名に対するマッピングを指
定したことになります。
TLD がピリオド(`.
')の場合を除き、TLD の先頭のピリオドは
省略可能です。
ローカルエンコーディングについて
ローカルエンコーディングについては、ロケールや環境変数から自動判定するため、 設定ファイルでは、ローカルエンコーディングを設定するエントリはありません。 ただし、この自動判定は正しく行われないこともあります。 このとき、理由としては以下のことが考えられます。
- ロケールから推定したローカルエンコーディングが間違っている
- ロケールから推定したローカルエンコーディングを iconv ライブラリが 認識できない
- C ロケールのままアプリケーションを実行したとき
1 番目は、たとえばロケールに "japanese" のような、具体的なエンコーディング の名称を含まないものを設定していると起きる可能性があります。 2 番目は、たとえばロケールに "ja_JP.eucJP" を設定していた場合、 iconv ライブラリが "EUC-JP" は認識できても "eucJP" は指定できなかった、 という場合に起こり得ます。
また、上記に加えて runidn コマンドでは以下の理由でも自動判定が正しく 行われません。
-
setlocale()
関数を使用していないアプリケーションを実行 したとき
これは、setlocale()
を使用していないと、アプリケーション
は C ロケールに設定されているものとして動作するためです。
idnconv や BIND パッチを適用した dig, nslookup, host では、
setlocale()
を使用していますので、この問題は起きません。
原因はいずれにしろ、この問題を回避するには
- 環境変数
IDN_LOCAL_CODESET
に ローカルエンコーディングを設定する - エイリアスファイルにエイリアスを記述する
というふたつの方法があります。ここでは、環境変数を使用した方法について 記述します。後者の詳細については、 エイリアスファイルについて をごらんください。
この環境変数がセットされていると、その値がロケールの設定よりも優先される ようになっています。 たとえばローカルエンコーディングを EUC-JP に設定する場合には、 あらかじめ次のような設定をしておきます。
[設定例]
sh 系のシェルの場合:
$ IDN_LOCAL_CODESET=EUC-JP $ export IDN_LOCAL_CODESETcsh 系のシェルの場合:
% setenv IDN_LOCAL_CODESET EUC-JP
指定する値はローカルエンコーディング名で、これは iconv ライブラリが 受け付ける名前 (もしくは エイリアスファイル にエイリアスとして登録されているエンコーディング名) で指定します。
もしあなたが単一のローカルエンコーディングしか使用していないのであれば、
環境変数 IDN_LOCAL_CODESET
の設定を .profile
や .cshrc
等に入れておくことをお勧めします。
エイリアスファイルについて
エイリアスファイルは、IDN エンコーディングやローカルエンコーディング の名称を「別名」から「正式名」に変換するためのファイルです。 idnkit の設定ファイル等で指定されたエンコーディングは、最初に必ず エイリアスファイルの記述にしたがって「正式名」に変換されます。
なぜこのようなファイルが必要なのかというと、iconv() は実装によって認識 できるエンコーディング名が異なるためです。 (たとえば、ある実装では "eucJP" を認識するけれども "EUC-JP" は認識しない、 といったことが実際にあります。) エイリアスファイルを使って iconv() が認識できない「別名」を認識できる 「正式名」に変換することによって、iconv() の実装による差異を吸収することが できます。
エイリアスファイルは単純なテキストファイルです。
`#'
で始まる行および空行は、無視されます。
それ以外の行は、次のような形式でなくてはなりません。
<エイリアス> <正式名>
<エイリアス>には、<正式名>
に変換したいエンコーディング名を記述します。
<エイリアス> に `*'
を含んだ場合は、
その部分は任意の文字列に一致します。
[設定例]
*.ISO_8859-2 ISO-8859-1 *.Shift_JIS Shift_JIS ko_KR.EUC EUC-KR *.GB2312 GB2312 ja EUC-JP
別名がエイリアスファイル内の複数の行にマッチする場合は、ファイルの先頭 に最も近い行が選ばれます。また、エイリアスがどの行にもマッチしなければ、その エイリアスをそのまま正式名とします。
かつては idnkit の設定ファイルにおいて エンコーディング名称のエイリアスを定義したファイルへのパス名を 指定することができましたが、idnkit の仕様変更に伴い、 デフォルトのエイリアスファイルのみを自動的に読み込むように 変更されました。この変更により、設定ファイルでエイリアスファイルの パス名は指定できなくなりました。
自動的に読み込まれるエイリアスファイルは、UNIX の場合、
システムの設定ファイルが置かれているディレクトリの
idnalias.conf
です。Windows の場合は、レジストリ情報で
指定されています。
マップファイルの形式について
マップファイルは、
local-map
エントリ向けに、
文字のマッピング規則を定義したファイルです。
マップ元として文字 1 個、マップ先として 0 文字以上の文字の並びを指定
できます。
前後の文字でマッピング規則を変えるような、文脈に依存したマッピングは
できません。
マップファイルは単純なテキストファイルで、一行に一つのマッピング
規則を書くようになっています。マッピング規則は、次の書式で記述します。
`#'
で始まる行および空行は、無視されます。
<マップ元のコードポイント>; <マップ先のコードポイント列>;
<マップ元のコードポイント>には、マップ元の文字の Unicodeコードポイントを16進数で記述します。 <マップ先のコードポイント列>には、マップ先の文字列 の各文字のUnicodeコードポイント値を16進数で記述します。 先頭の文字から順番に空白で区切って並べていきます。 マップ先が空の文字列の場合、<マップ先のコードポイント列> は空白になります。
[設定例]
# "A" を "a" にマップ 0041; 0061; # "#" は何にもマップしない 0023; ; # "@" を "at" にマップ 0040; 0061 0074;
セットファイルの形式について
セットファイルは idnkit に行うことのできる設定方法のひとつですが、 通常の設定ファイルとして使用することはできません。 セットファイルは特殊な場合のみに使用されます。
セットファイルは、以前、設定ファイル内で記述することのできた
nameprep-prohibit
およびnameprep-unassigned
エントリ向けに、ドメイン名として使用を許可しないUnicodeコードポイント
の集合を定義したファイルです。
しかし、現在のidnkitの設定ファイルでは、
nameprep-prohibit
やnameprep-unassigned
という設定項目が存在しないため、セットファイルを利用した設定を、
設定ファイル内でおこなうことはできません。
ただし、idnkit ライブラリを利用してアプリケーションを作成する場合は、
関数を利用してセットファイルを idnkit に読み込ませることが可能です。
セットファイルは単純なテキストファイルで、一行に一つのコードポイント、 もしくはコードポイントの範囲を記述します。書式は次の通りです。
<コードポイント>
<開始コードポイント>-<終了コードポイント>
それぞれ、コードポイントには Unicodeコードポイントを16進数で記述します。
`#'
で始まる行および空行は、無視されます。
環境変数について
idnkit に関連する環境変数には、以下のものがあります。
-
IDN_LOCAL_CODESET
- ローカルエンコーディングを明示的に設定するために使用します。 詳しくは ローカルエンコーディングについて をごらんください。
-
LC_ALL
LC_CTYPE
LANG
- idnkit 固有の環境変数ではありませんが、これらが定義されていると、 ローカルエンコーディングの判定に影響を与えます。 詳しくは ローカルエンコーディングについて をごらんください。
-
IDN_DISABLE
-
この変数が定義されている時には、IDN ライブラリの提供する
ドメイン名の国際化対応機能が働かなくなります。
IDN ライブラリを使用しているアプリケーションは、この環境変数の影響
を受けます。
ただし、アプリケーションによっては、明示的にこの環境変数を無視する ように設定しているかも知れません。 idnkit 付属の
idnconv
,runidn
コマンドは IDN ライブラリを使用していますが、いずれもこの環境変数 を無視して常に国際化対応機能が働くようになっています。 (国際化対応が無効になると、これらのコマンドは無意味だからです。) - IDN_LOG_LEVEL
- ログ出力のレベルを設定します。設定できる値は 0 から 5 までの
数値で、大きな数字を設定すると、それ以下の数字の設定時に出力される
ログも同時に出力されます。
- 0 - 致命的なエラーの場合のみログの表示を行います。(デフォルト)
- 1 - 一般的なエラーが起こった場合にログの表示を行います。
- 2 - 警告ログを表示します。
- 3 - 情報ログを表示します。
- 4 - トレースログを表示します。
- 5 - ダンプログを表示します。