バージョン 2.3 で 新たに追加 された仕様です。
このモジュールでは RFC 3490 (アプリケーションにおける国際化
ドメイン名, IDNA: Internationalized Domain Names in
Applications) および RFC 3492 (Nameprep: 国際化ドメイン名 (IDN) の
ための stringprep プロファイル) を実装しています。
このモジュールは punycode
エンコーディングおよび
stringprep の上に構築されています。
これらの RFC はともに、非 ASCII 文字の入ったドメイン名をサポートする ためのプロトコルを定義しています。 (``www.Alliancefrançaise.nu'' のような) 非 ASCII 文字を含む ドメイン名は、 ASCIIと互換性のあるエンコーディング (ACE、 ``www.xn-alliancefranaise-npb.nu'' のような形式) に変換されます。 ドメイン名の ACE 形式は、DNS クエリ、HTTP Host: フィールド などといった、プロトコル中で任意の文字を使えないような全ての局面で 用いられます。 この変換はアプリケーション内で行われます; 可能ならユーザからは 不可視となります: アプリケーションは Unicode ドメインラベルを ワイヤ上に載せる際に IDNA に、 ACE ドメインラベルを ユーザに提供する前に Unicode に、それぞれ透過的に変換しなければ なりません。
Python ではこの変換をいくつかの方法でサポートします: idna
codec は Unicode と ACE 間の変換を行います。さらに、
socket モジュールは Unicode ホスト名を ACE に透過的に
変換するため、アプリケーションはホスト名を socket
モジュールに渡す際にホスト名の変換に煩わされることがありません。
その上で、ホスト名を関数パラメタとして持つ、httplib
や ftplib のようなモジュールでは Unicode ホスト名を
受理します (httplib でもまた、Host:
フィールドにある
IDNA ホスト名を、フィールド全体を送信する場合に透過的に送信
します)。
(逆引きなどによって) ワイヤ越しにホスト名を受信する際、Unicode への自動変換は行われません: こうしたホスト名をユーザに提供 したいアプリケーションでは、Unicode にデコードしてやる必要が あります。
encodings.idna ではまた、nameprep 手続きを実装しています。 nameprep はホスト名に対してある正規化を行って、国際化ドメイン名で 大小文字を区別しないようにするとともに、類似の文字を一元化します。 nameprep 関数は必要なら直接使うこともできます。
label) |
AllowUnassigned
は真です。
label) |
UseSTD3ASCIIRules
は偽であると仮定します。
label) |