4.9.3 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 モジュールに渡す際にホスト名の変換に煩わされることがありません。 その上で、ホスト名を関数パラメタとして持つ、httplibftplib のようなモジュールでは 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 に変換します。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。