## 4 `encodings.idna` -- アプリケーションにおける国際化ドメイン名 (IDNA)

バージョン 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 関数は必要なら直接使うこともできます。

`nameprep`( | label)

  label を nameprep したバージョンを返します。現在の実装では クエリ文字列を仮定しているので、 `AllowUnassigned` は真です。

`ToASCII`( | label)

  RFC 3490 仕様に従ってラベルを ASCIIに変換します。 `UseSTD3ASCIIRules` は偽であると仮定します。

`ToUnicode`( | label)

  RFC 3490 仕様に従ってラベルを Unicode に変換します。