7.2. codecs
— codec レジストリと基底クラス¶
ソースコード: Lib/codecs.py
このモジュールは、標準的な Python codec (エンコーダとデコーダ) 用の基底クラスを定義し、codec とエラー処理検索プロセスを管理する内部の Python codec レジストリへのアクセスを提供します。多くの codec はテキストをバイト形式にエンコードする テキストエンコーディング ですが、テキストをテキストに、またはバイトをバイトにエンコードする codec も提供されています。カスタムの codec は任意の型間でエンコードとデコードを行えますが、一部のモジュール機能は テキストエンコーディング か bytes
へのエンコードのみに制限されています。
このモジュールでは、任意の codec でエンコードやデコードを行うための、以下の関数が定義されています。
-
codecs.
encode
(obj, encoding='utf-8', errors='strict')¶ encoding に記載された codec を使用して obj をエンコードします。
希望のエラー処理スキームを errors に設定することができます。デフォルトのエラーハンドラ (エラー処理関数) は
'strict'
です。これはエンコードエラーはValueError
(もしくはUnicodeEncodeError
のような、より codec に固有のサブクラス) を送出することを意味します。codec エラー処理についてのより詳しい情報は Codec 基底クラス を参照してください。
-
codecs.
decode
(obj, encoding='utf-8', errors='strict')¶ encoding に記載された codec を使用して obj をデコードします。
希望のエラー処理スキームを errors に設定することができます。デフォルトのエラーハンドラは
'strict'
です。これはデコードエラーはValueError
(もしくはUnicodeDecodeError
のような、より codec に固有のサブクラス) を送出することを意味します。codec エラー処理についてのより詳しい情報は Codec 基底クラス を参照してください。
各 codec についての詳細も、次のようにして直接調べることができます。
-
codecs.
lookup
(encoding)¶ Python codec レジストリから codec 情報を探し、以下で定義するような
CodecInfo
オブジェクトを返します。エンコーディングの検索は、まずレジストリのキャッシュから行います。見つからなければ、登録されている検索関数のリストから探します。
CodecInfo
オブジェクトが一つも見つからなければLookupError
を送出します。見つかったら、そのCodecInfo
オブジェクトはキャッシュに保存され、呼び出し側に返されます。
-
class
codecs.
CodecInfo
(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)¶ codec レジストリ内を検索する場合の、codec の詳細です。コントラクタ引数は、次の同名の属性に保存されます。
-
name
¶ エンコーディングの名前です。
-
encode
¶ -
decode
¶ ステートレスなエンコーディングとデコーディングの関数です。これらは、Codec インスタンスの
encode()
メソッドとdecode()
メソッドと同じインターフェースを持っている必要があります (see Codec のインターフェース を参照)。この関数またはメソッドは、ステートレスモードで動作することが想定されています。
-
incrementalencoder
¶ -
incrementaldecoder
¶ インクリメンタル・エンコーダとデコーダのクラスまたはファクトリ関数です。これらは、基底クラスの
IncrementalEncoder
とIncrementalDecoder
が定義するインターフェースをそれぞれ提供する必要があります。インクリメンタルな codec は、ステート (内部状態) を保持することができます。
-
streamwriter
¶ -
streamreader
¶ ストリームライターとリーダーのクラスまたはファクトリ関数です。これらは、基底クラスの
StreamWriter
とStreamReader
が定義するインターフェースをそれぞれ提供する必要があります。ストリーム codec は、ステートを保持することができます。
-
さまざまな codec 構成要素へのアクセスを簡便化するために、このモジュールは以下のような関数を提供しています。これらの関数は、 codec の検索に lookup()
を使います:
-
codecs.
getencoder
(encoding)¶ 与えられたエンコーディングに対する codec を検索し、エンコーダ関数を返します。
エンコーディングが見つからなければ
LookupError
を送出します。
-
codecs.
getdecoder
(encoding)¶ 与えられたエンコーディングに対する codec を検索し、デコーダ関数を返します。
エンコーディングが見つからなければ
LookupError
を送出します。
-
codecs.
getincrementalencoder
(encoding)¶ 与えられたエンコーディングに対する codec を検索し、インクリメンタル・エンコーダクラスまたはファクトリ関数を返します。
エンコーディングが見つからないか、 codec がインクリメンタル・エンコーダをサポートしなければ
LookupError
を送出します。
-
codecs.
getincrementaldecoder
(encoding)¶ 与えられたエンコーディングに対する codec を検索し、インクリメンタル・デコーダクラスまたはファクトリ関数を返します。
エンコーディングが見つからないか、 codec がインクリメンタル・デコーダをサポートしなければ
LookupError
を送出します。
-
codecs.
getreader
(encoding)¶ 与えられたエンコーディングに対する codec を検索し、
StreamReader
クラスまたはファクトリ関数を返します。エンコーディングが見つからなければ
LookupError
を送出します。
-
codecs.
getwriter
(encoding)¶ 与えられたエンコーディングに対する codec を検索し、
StreamWriter
クラスまたはファクトリ関数を返します。エンコーディングが見つからなければ
LookupError
を送出します。
次のように、適切な codec 検索関数を登録することで、カスタムの codecs を利用することができます。
-
codecs.
register
(search_function)¶ codec 検索関数を登録します。検索関数は第 1 引数にすべてアルファベットの小文字から成るエンコーディング名を取り、
CodecInfo
オブジェクトを返します。検索関数が指定されたエンコーディングを見つけられない場合、None
を返します。注釈
現在、検索関数の登録は不可逆的です。このため、ユニットテストやモジュールの再ロード時などに問題が生じることがあります。
エンコードされたテキストファイルを処理する場合、組み込みの open()
とそれに関連付けられた io
モジュールの使用が推奨されていますが、このモジュールは追加のユーティリティ関数とクラスを提供し、バイナリファイルを処理する場合に幅広い codecs を利用できるようにします。
-
codecs.
open
(filename, mode='r', encoding=None, errors='strict', buffering=1)¶ エンコードされたファイルを mode を使って開き、透過的なエンコード/デコードを提供する
StreamReaderWriter
のインスタンスを返します。デフォルトのファイルモードは'r'
、つまり、読み出しモードでファイルを開きます。注釈
下層のエンコードされたファイルは、常にバイナリモードで開きます。読み書き時に、
'\n'
の自動変換は行われません。mode 引数は、組み込みのopen()
関数が受け入れる任意のバイナリモードにすることができます。'b'
が自動的に付加されます。encoding は、そのファイルに対して使用されるエンコーディングを指定します。バイトにエンコードする、あるいはバイトからデコードするすべてのエンコーディングが許可されます。ファイルメソッドがサポートするデータ型は、使用される codec によって異なります。
エラーハンドリングのために errors を渡すことができます。これはデフォルトでは
'strict'
で、エンコード時にエラーがあればValueError
を送出します。buffering は組み込み関数
open()
の場合と同じ意味を持ちます。デフォルトでは行バッファリングです。
-
codecs.
EncodedFile
(file, data_encoding, file_encoding=None, errors='strict')¶ 透過的なエンコード変換を行うファイルのラップされたバージョンである、
StreamRecoder
インスタンスを返します。元のファイルは、ラップされたバージョンが閉じられる時に、閉じられます。ラップされたファイルに書き込まれたデータは、指定された data_encoding に従ってデコードされ、次に file_encoding を使用して元のファイルにバイトとして書き出されます。元のファイルから読み出されたバイトは、file_encoding に従ってデコードされ、結果は data_encoding を使用してエンコードされます。
file_encoding が与えられなければ、data_encoding がデフォルトになります。
エラーハンドリングのために errors を渡すことができます。これはデフォルトでは
'strict'
で、エンコード時にエラーがあればValueError
を送出します。
-
codecs.
iterencode
(iterator, encoding, errors='strict', **kwargs)¶ インクリメンタル・エンコーダを使って、 iterator から供給される入力を反復的にエンコードします。この関数は generator です。 errors 引数は (他のあらゆるキーワード引数と同様に) インクリメンタル・エンコーダにそのまま引き渡されます。
この関数では、コーデックはエンコードするテキストの
str
オブジェクトを受け付ける必要があります。 従って、base64_codec
のようなバイトからバイトへのエンコーダはサポートしていません。
-
codecs.
iterdecode
(iterator, encoding, errors='strict', **kwargs)¶ インクリメンタル・デコーダを使って、 iterator から供給される入力を反復的にデコードします。この関数は generator です。 errors 引数は (他のあらゆるキーワード引数と同様に) インクリメンタル・デコーダにそのまま引き渡されます。
この関数では、コーデックはエンコードする
bytes
オブジェクトを受け付ける必要があります。 従って、rot_13
のようなテキストからテキストへのエンコーダがiterencode()
で同等に使えるとしても、この関数ではサポートしていません。
このモジュールは以下のような定数も定義しています。プラットフォーム依存なファイルを読み書きするのに役立ちます:
-
codecs.
BOM
¶ -
codecs.
BOM_BE
¶ -
codecs.
BOM_LE
¶ -
codecs.
BOM_UTF8
¶ -
codecs.
BOM_UTF16
¶ -
codecs.
BOM_UTF16_BE
¶ -
codecs.
BOM_UTF16_LE
¶ -
codecs.
BOM_UTF32
¶ -
codecs.
BOM_UTF32_BE
¶ -
codecs.
BOM_UTF32_LE
¶ これらの定数は、いくつかのエンコーディングの Unicode のバイトオーダマーク (BOM) で、様々なバイトシーケンスを定義します。これらは、UTF-16 と UTF-32 のデータストリームで使用するバイトオーダを指定したり、 UTF-8 で Unicode シグネチャとして使われます。
BOM_UTF16
は、プラットフォームのネイティブバイトオーダによってBOM_UTF16_BE
またはBOM_UTF16_LE
です。BOM
はBOM_UTF16
のエイリアスです。同様に、BOM_LE
はBOM_UTF16_LE
の、BOM_BE
はBOM_UTF16_BE
のエイリアスです。その他の定数は UTF-8 と UTF-32 エンコーディングの BOM を表します。
7.2.1. Codec 基底クラス¶
codecs
モジュールは、 codec オブジェクトを操作するインタフェースを定義する一連の基底クラスを定義します。このモジュールは、カスタムの codec の実装の基礎として使用することもできます。
Python で codec として使えるようにするには、ステートレスエンコーダ、ステートレスデコーダ、ストリームリーダ、ストリームライタの 4 つのインタフェースを定義する必要があります。通常は、ストリームリーダとライタはステートレスエンコーダとデコーダを再利用して、ファイルプロトコルを実装します。codec の作者は、codec がエンコードとデコードのエラーの処理方法も定義する必要があります。
7.2.1.1. エラーハンドラ¶
エラー処理の簡便化と標準化のため、コーデックは、errors 文字列引数を指定した場合に別のエラー処理を行うような仕組みを実装してもかまいません。全ての標準 Python codec では以下の文字列が定義され、実装されています:
値 |
意味 |
---|---|
'strict' |
|
'ignore' |
不正な形式のデータを無視し、何も通知することなく処理を継続します。 |
以下のエラーハンドラは、 テキストエンコーディング にのみ適用されます。
値 |
意味 |
---|---|
'replace' |
適当な置換マーカーで置換します。Python では、組み込み codec のデコード時には公式の |
'xmlcharrefreplace' |
適切な XML 文字参照で置換します (エンコードのみ)。 |
'backslashreplace' |
バックスラッシュつきのエスケープシーケンスで置換します。 |
'namereplace' |
|
'surrogateescape' |
デコード時には、バイト列を |
さらに、次のエラーハンドラは与えられた codec に特有です:
値 |
Codecs | 意味 |
---|---|---|
'surrogatepass' |
utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le | サロゲートコードのエンコードとデコードを許可します。通常、これらの codecc は、サロゲートの存在をエラーとして扱います。 |
バージョン 3.1 で追加: 'surrogateescape'
および 'surrogatepass'
エラーハンドラ。
バージョン 3.4 で変更: 'surrogatepass'
エラーハンドラは utf-16* コーデックと utf-32* コーデックで動作するようになりました。
バージョン 3.5 で追加: 'namereplace'
エラーハンドラです。
バージョン 3.5 で変更: 'backslashreplace'
エラーハンドラは、デコード時と翻訳時に動作するようになりました。
次のように、名前付きの新しいエラーハンドラを登録することで、許可される値の集合を拡張することができます。
-
codecs.
register_error
(name, error_handler)¶ エラーハンドラ error_handler を名前 name で登録します。エンコード中およびデコード中にエラーが送出された場合、name が errors 引数として指定されていれば error_handler が呼び出されます。
error_handler はエラーの場所に関する情報の入った
UnicodeEncodeError
インスタンスとともに呼び出されます。エラー処理関数はこの例外を送出するか、別の例外を送出するか、入力のエンコードできなかった部分の代替文字列とエンコードを再開する場所が入ったタプルを返す必要があります。代替文字列はstr
またはbytes
のいずれかにすることができます。代替文字列がバイト列である場合、エンコーダは単に出力バッファにそれをコピーします。代替文字列が文字列である場合、エンコーダは代替文字列をエンコードします。元の入力中の指定位置からエンコードが再開されます。位置を負の値にすると、入力文字列の末端からの相対位置として扱われます。境界の外側にある位置を返した場合にはIndexError
が送出されます。デコードと翻訳の動作は似ていますが、エラーハンドラに渡されるのが
UnicodeDecodeError
かUnicodeTranslateError
である点と、エラーハンドラの置換した内容が直接出力されるという点が異なります。
登録済みのエラーハンドラ (標準エラーハンドラを含む) は、次のようにその名前で検索することができます。
-
codecs.
lookup_error
(name)¶ 名前 name で登録済みのエラーハンドラを返します。
エラーハンドラが見つからなければ
LookupError
を送出します。
以下の標準エラーハンドラも、モジュールレベルの関数として利用できます。
-
codecs.
strict_errors
(exception)¶ strict
エラー処理を実装します。エンコードエラーまたはデコードエラーはそれぞれUnicodeError
を送出します。
-
codecs.
replace_errors
(exception)¶ 'replace'
エラー処理を実装します ( テキストエンコーディング のみ)。(codec によりエンコードする必要のある) エンコードエラーに対しては'?'
に、デコードエラーに対しては'\ufffd'
(Unicode 代替文字) に置き換えます。
-
codecs.
ignore_errors
(exception)¶ ignore
エラー処理を実装します。不正な形式のデータは無視され、エンコードまたはデコードは何も通知することなく継続されます。
-
codecs.
xmlcharrefreplace_errors
(exception)¶ 'xmlcharrefreplace'
エラー処理を実装します ( テキストエンコーディング のエンコードのみ)。エンコードできない文字は、適切な XML 文字参照に置き換えます。
-
codecs.
backslashreplace_errors
(exception)¶ 'backslashreplace'
エラー処理を実装します ( テキストエンコーディング のエンコードのみ)。不正な形式のデータは、バックスラッシュ付きのエスケープシーケンスに置き換えます。
-
codecs.
namereplace_errors
(exception)¶ 'namereplace'
エラー処理を実装します ( テキストエンコーディング のエンコードのみ)。エンコードできない文字は、\N{...}
エスケープシーケンスに置き換えます。バージョン 3.5 で追加.
7.2.1.2. ステートレスなエンコードとデコード¶
基底の Codec
クラスは以下のメソッドを定義します。これらのメソッドは、内部状態を持たないエンコーダ/デコーダ関数のインタフェースを定義します:
-
Codec.
encode
(input[, errors])¶ オブジェクト input エンコードし、(出力オブジェクト, 消費した長さ) のタプルを返します。例えば、 テキストエンコーディング は文字列オブジェクトを特有の文字セット (例えば
cp1252
やiso-8859-1
) を用いてバイト列オブジェクトに変換します。errors 引数は適用するエラー処理を定義します。
'strict'
処理がデフォルトです。このメソッドは
Codec
に内部状態を保存してはなりません。効率よくエンコードするために状態を保持しなければならないような codecs にはStreamWriter
を使ってください。エンコーダは長さが 0 の入力を処理できなければなりません。この場合、空のオブジェクトを出力オブジェクトとして返さなければなりません。
-
Codec.
decode
(input[, errors])¶ オブジェクト input をデコードし、(出力オブジェクト, 消費した長さ) のタプルを返します。例えば、 テキストエンコーディング は、特定の文字集合エンコーディングでエンコードされたバイト列オブジェクトを文字列オブジェクトに変換します。
テキストエンコーディングとバイト列からバイト列への codec では、input は bytes オブジェクト、または読み込み専用のバッファインタフェースを提供するオブジェクトである必要があります。例えば、buffer オブジェクトやメモリマップドファイルでなければなりません。
errors 引数は適用するエラー処理を定義します。
'strict'
処理がデフォルトです。このメソッドは、
Codec
インスタンスに内部状態を保存してはなりません。効率よくエンコード/デコードするために状態を保持しなければならないような codecs にはStreamReader
を使ってください。デコーダは長さが 0 の入力を処理できなければなりません。この場合、空のオブジェクトを出力オブジェクトとして返さなければなりません。
7.2.1.3. インクリメンタルなエンコードとデコード¶
IncrementalEncoder
クラスおよび IncrementalDecoder
クラスはそれぞれインクリメンタル・エンコードおよびデコードのための基本的なインタフェースを提供します。エンコード/デコードは内部状態を持たないエンコーダ/デコーダを一度呼び出すことで行なわれるのではなく、インクリメンタル・エンコーダ/デコーダの encode()
/decode()
メソッドを複数回呼び出すことで行なわれます。インクリメンタル・エンコーダ/デコーダはメソッド呼び出しの間エンコード/デコード処理の進行を管理します。
encode()
/decode()
メソッド呼び出しの出力結果をまとめたものは、入力をひとまとめにして内部状態を持たないエンコーダ/デコーダでエンコード/デコードしたものと同じになります。
7.2.1.3.1. IncrementalEncoder オブジェクト¶
IncrementalEncoder
クラスは入力を複数ステップでエンコードするのに使われます。全てのインクリメンタル・エンコーダが Python codec レジストリと互換性を持つために定義すべきメソッドとして、このクラスには以下のメソッドが定義されています。
-
class
codecs.
IncrementalEncoder
(errors='strict')¶ IncrementalEncoder
インスタンスのコンストラクタ。全てのインクリメンタル・エンコーダはこのコンストラクタインタフェースを提供しなければなりません。さらにキーワード引数を付け加えるのは構いませんが、Python codec レジストリで利用されるのはここで定義されているものだけです。
IncrementalEncoder
は、 errors キーワード引数を提供することで、様々なエラー取扱方法を実装することができます。取り得る値については エラーハンドラ を参照してください。errors 引数は、同名の属性に代入されます。この属性を変更すると、
IncrementalEncoder
オブジェクトが生きている間に、異なるエラー処理方法に切り替えることができるようになります。-
encode
(object[, final])¶ object を(エンコーダの現在の状態を考慮に入れて)エンコードし、得られたエンコードされたオブジェクトを返します。
encode()
呼び出しがこれで最後という時には final は真でなければなりません(デフォルトは偽です)。
-
reset
()¶ エンコーダを初期状態にリセットします。出力は破棄されます。
.encode(object, final=True)
を呼び出して、必要に応じて空バイト列またはテキスト文字列を渡すことにより、エンコーダをリセットし、出力を取得します。
-
-
IncrementalEncoder.
getstate
()¶ エンコーダの現在の状態を返します。それは必ず整数でなければなりません。実装は、
0
が最も一般的な状態であることを保証すべきです (整数より複雑な状態は、状態を marshal/pickle して生じた文字列のバイトを整数にコード化することによって整数に変換することができます)。
-
IncrementalEncoder.
setstate
(state)¶ エンコーダの状態を state にセットします。 state は
getstate()
によって返されたエンコーダ状態でなければなりません。
7.2.1.3.2. IncrementalDecoder オブジェクト¶
IncrementalDecoder
クラスは入力を複数ステップでデコードするのに使われます。全てのインクリメンタル・デコーダが Python codec レジストリと互換性を持つために定義すべきメソッドとして、このクラスには以下のメソッドが定義されています。
-
class
codecs.
IncrementalDecoder
(errors='strict')¶ IncrementalDecoder
インスタンスのコンストラクタ。全てのインクリメンタル・デコーダはこのコンストラクタインタフェースを提供しなければなりません。さらにキーワード引数を付け加えるのは構いませんが、Python codec レジストリで利用されるのはここで定義されているものだけです。
IncrementalDecoder
は、 errors キーワード引数を提供することで、様々なエラー取扱方法を実装することができます。取り得る値については エラーハンドラ を参照してください。errors 引数は、同名の属性に代入されます。この属性を変更すると、
IncrementalDecoder
オブジェクトが生きている間に、異なるエラー処理方法に切り替えることができるようになります。-
decode
(object[, final])¶ object を(デコーダの現在の状態を考慮に入れて)デコードし、得られたデコードされたオブジェクトを返します。
decode()
呼び出しがこれで最後という時には final は真でなければなりません(デフォルトは偽です)。もし final が真ならばデコーダは入力をデコードし切り全てのバッファをフラッシュしなければなりません。そうできない場合(たとえば入力の最後に不完全なバイト列があるから)、デコーダは内部状態を持たない場合と同じようにエラーの取り扱いを開始しなければなりません(例外を送出するかもしれません)。
-
reset
()¶ デコーダを初期状態にリセットします。
-
getstate
()¶ デコーダの現在の状態を返します。これは2要素を含むタプルでなければなりません。1番目はまだデコードされていない入力を含むバッファです。2番目は整数で、付加的な状態情報です (実装は
0
が最も一般的な付加的な状態情報であることを保証すべきです)。この付加的な状態情報が0
である場合、デコーダを入力がバッファされていない状態に戻して、付加的な状態情報を0
にセットすることが可能でなければなりません。その結果、以前バッファされた入力をデコーダに与えることで、何の出力もせずにデコーダを前の状態に戻します。 (整数より複雑な付加的な状態情報は、情報を marshal/pickle して、結果として生じる文字列のバイト列を整数にエンコードすることで、整数に変換することができます。)
-
setstate
(state)¶ エンコーダ (訳注: デコーダの間違い?) の状態を state にセットします。 state は
getstate()
によって返されたデコーダ状態でなければなりません。
-
7.2.1.4. ストリームのエンコードとデコード¶
StreamWriter
と StreamReader
クラスは、新しいエンコーディングサブモジュールを非常に簡単に実装するのに使用できる、一般的なインターフェイスを提供します。実装例は encodings.utf_8
をご覧ください。
7.2.1.4.1. StreamWriter オブジェクト¶
StreamWriter
クラスは Codec
のサブクラスで、以下のメソッドを定義しています。全てのストリームライタは、 Python の codec レジストリとの互換性を保つために、これらのメソッドを定義する必要があります。
-
class
codecs.
StreamWriter
(stream, errors='strict')¶ StreamWriter
インスタンスのコンストラクタです。全てのストリームライタはコンストラクタとしてこのインタフェースを提供しなければなりません。キーワード引数を追加しても構いませんが、Python の codec レジストリはここで定義されている引数だけを使います。
stream 引数は、特定の codec に対応して、テキストまたはバイナリデータの書き込みが可能なファイルライクオブジェクトである必要があります。
StreamWriter
は、 errors キーワード引数を提供することで、様々なエラー取扱方法を実装することができます。下層のストリーム codec がサポートできる標準エラーハンドラについては エラーハンドラ を参照してください。errors 引数は、同名の属性に代入されます。この属性を変更すると、
StreamWriter
オブジェクトが生きている間に、異なるエラー処理に変更できます。-
write
(object)¶ object の内容をエンコードしてストリームに書き出します。
-
writelines
(list)¶ 文字列からなるリストを連結して、ストリームに書き出します (可能な場合には
write()
を再利用します) 。バイト列からバイト列への標準 codecs は、このメソッドをサポートしません。
-
reset
()¶ 状態保持に使われていた codec のバッファを強制的に出力してリセットします。
このメソッドが呼び出された場合、出力先データをきれいな状態にし、わざわざストリーム全体を再スキャンして状態を元に戻さなくても新しくデータを追加できるようにしなければなりません。
-
ここまでで挙げたメソッドの他にも、 StreamWriter
では背後にあるストリームの他の全てのメソッドや属性を継承しなければなりません。
7.2.1.4.2. StreamReader オブジェクト¶
StreamReader
クラスは Codec
のサブクラスで、以下のメソッドを定義しています。全てのストリームリーダは、 Python の codec レジストリとの互換性を保つために、これらのメソッドを定義する必要があります。
-
class
codecs.
StreamReader
(stream, errors='strict')¶ StreamReader
インスタンスのコンストラクタです。全てのストリームリーダはコンストラクタとしてこのインタフェースを提供しなければなりません。キーワード引数を追加しても構いませんが、Python の codec レジストリはここで定義されている引数だけを使います。
stream 引数は、特定の codec に対応して、テキストまたはバイナリデータの読み出しが可能なファイルライクオブジェクトである必要があります。
StreamReader
は、 errors キーワード引数を提供することで、様々なエラー取扱方法を実装することができます。下層のストリーム codec がサポートできる標準エラーハンドラについては エラーハンドラ を参照してください。errors 引数は、同名の属性に代入されます。この属性を変更すると、
StreamReader
オブジェクトが生きている間に、異なるエラー処理に変更できます。errors 引数に許される値の集合は
register_error()
で拡張できます。-
read
([size[, chars[, firstline]]])¶ ストリームからのデータをデコードし、デコード済のオブジェクトを返します。
chars 引数は、いくつのデコードされたコードポイントまたはバイト列を返すかを表します。
read()
メソッドは、要求された数以上のデータを返すことはありませんが、データがそれより少ない場合には要求された数未満のデータを返す場合があります。size 引数は、デコード用に読み込むエンコードされたバイト列またはコードポイントの、およその最大バイト数を表します。デコーダはこの値を適切な値に変更できます。デフォルト値 -1 の場合、可能な限り多くのデータを読み込みます。この引数の目的は、巨大なファイルの一括デコードを防ぐことにあります。
firstline フラグは、1行目さえ返せばその後の行でデコードエラーがあっても無視して十分だ、ということを示します。
このメソッドは貪欲な読み込み戦略を取るべきです。すなわち、エンコーディング定義と size の値が許す範囲で、できるだけ多くのデータを読むべきだということです。たとえば、ストリーム上にエンコーディングの終端や状態の目印があれば、それも読み込みます。
-
readline
([size[, keepends]])¶ 入力ストリームから1行読み込み、デコード済みのデータを返します。
size が与えられた場合、ストリームの
read()
メソッドに size 引数として渡されます。keepends が偽の場合には行末の改行が削除された行が返ります。
-
readlines
([sizehint[, keepends]])¶ 入力ストリームから全ての行を読み込み、行のリストとして返します。
keepends が真なら、改行は、codec のデコーダメソッドを使って実装され、リスト要素の中に含まれます。
sizehint が与えられた場合、ストリームの
read()
メソッドに size 引数として渡されます。
-
reset
()¶ 状態保持に使われた codec のバッファをリセットします。
ストリームの読み位置を再設定してはならないので注意してください。このメソッドはデコードの際にエラーから復帰できるようにするためのものです。
-
ここまでで挙げたメソッドの他にも、 StreamReader
では背後にあるストリームの他の全てのメソッドや属性を継承しなければなりません。
7.2.1.4.3. StreamReaderWriter オブジェクト¶
StreamReaderWriter
は、読み書き両方に使えるストリームをラップできる便利なクラスです。
lookup()
関数が返すファクトリ関数を使って、インスタンスを生成するという設計です。
-
class
codecs.
StreamReaderWriter
(stream, Reader, Writer, errors)¶ StreamReaderWriter
インスタンスを生成します。 stream はファイル類似のオブジェクトです。 Reader と Writer は、それぞれStreamReader
とStreamWriter
インタフェースを提供するファクトリ関数かファクトリクラスでなければなりません。エラー処理は、ストリームリーダとライタで定義したものと同じように行われます。
StreamReaderWriter
インスタンスは、 StreamReader
クラスと StreamWriter
クラスを合わせたインタフェースを継承します。元になるストリームからは、他のメソッドや属性を継承します。
7.2.1.4.4. StreamRecoder オブジェクト¶
StreamRecoder
はデータをあるエンコーディングから別のエンコーディングに変換します。異なるエンコーディング環境を扱うとき、便利な場合があります。
lookup()
関数が返すファクトリ関数を使って、インスタンスを生成するという設計です。
-
class
codecs.
StreamRecoder
(stream, encode, decode, Reader, Writer, errors)¶ 双方向変換を実装する
StreamRecoder
インスタンスを生成します。 encode と decode はフロントエンド (read()
およびwrite()
を呼び出すコードから見えるデータ) ではたらき、 Reader と Writer はバックエンド (stream 内のデータ) ではたらきます。これらのオブジェクトを使って、たとえば、 Latin-1 から UTF-8 への変換、あるいは逆向きの変換を、透過的に行うことができます。
stream 引数はファイルライクオブジェクトでなくてはなりません。
encode 引数と decode 引数は
Codec
のインタフェースに忠実でなくてはなりません。Reader と Writer は、それぞれStreamReader
とStreamWriter
のインターフェースを提供するオブジェクトのファクトリ関数かクラスでなくてはなりません。エラー処理はストリーム・リーダやライタで定義されている方法と同じように行われます。
StreamRecoder
インスタンスは、 StreamReader
と StreamWriter
クラスを合わせたインタフェースを定義します。また、元のストリームのメソッドと属性も継承します。
7.2.2. エンコーディングと Unicode¶
文字列は内部的に 0x0
–0x10FFFF
の範囲のコードポイントのシーケンスとして格納されます (実装に関する詳細については PEP 393 を参照してください)。
文字列オブジェクトが CPU とメモリの外で使用されるようになると、エンディアンやこれらの配列をバイト列として格納する方法が問題になります。
他のコーデックでも同様ですが、文字列オブジェクトをバイト列に変換することは エンコード と呼ばれます。
また、バイト列から文字列オブジェクトを再生成することは デコード と呼ばれます。
テキストをシリアライズするコーデックには多くの種類があります。
それらは、集合的に term:テキストエンコーディング <text encoding> と呼ばれます。
最も単純なテキストエンコーディング ('latin-1'
または 'iso-8859-1'
) では、0–255 の範囲にあるコードポイントを 0x0
–0xff
のバイトにマップします。
つまり、この codec では U+00FF
以上のコードポイントを含む文字列オブジェクトをエンコードすることはできません。
このようなエンコード処理をしようとすると、次のように UnicodeEncodeError
が送出されます (エラーメッセージの細かところは異なる場合があります。): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256)
。
他のエンコーディングの一群 (charmap エンコーディングと呼ばれます) があり、 Unicode コードポイントの別の部分集合と、それらから 0x0
–0xff
のバイトへの対応付けを選択したものです。
これがどのように行なわれるかを知るには、単にたとえば encodings/cp1252.py
(主に Windows で使われるエンコーディングです) を開いてみてください。
256 文字のひとつの文字列定数があり、どの文字がどのバイト値へ対応付けられるかが示されています。
これらのエンコーディングはすべて、 Unicode に定義された 1114112 のコードポイントのうちの 256 だけをエンコードすることができます。 Unicode のすべてのコードポイントを格納するための単純で直接的な方法は、各コードポイントを連続する4バイトとして格納することです。これには2つの可能性があります: ビッグエンディアンまたはリトルエンディアンの順にバイトを格納することです。これら2つのエンコーディングはそれぞれ UTF-32-BE
および UTF-32-LE
と呼ばれます。それらのデメリットは、例えばリトルエンディアンのマシン上で UTF-32-BE
を使用すると、エンコードでもデコードでも常にバイト順を交換する必要があることです。UTF-32
はこの問題を回避します: バイト順は、常に自然なエンディアンに従います。しかし、これらのバイト順が異なるエンディアン性を持つ CPU によって読まれる場合、結局バイト順を交換しなければなりません。UTF-16
あるいは UTF-32
バイト列のエンディアン性を検出する目的で、いわゆる BOM (「バイト・オーダー・マーク」) があります。これは Unicode 文字 U+FEFF
です。この文字はすべての UTF-16
あるいは UTF-32
バイト列の前に置くことができます。この文字のバイトが交換されたバージョン (0xFFFE
) は、 Unicode テキストに現われてはならない不正な文字です。したがって、UTF-16
あるいは UTF-32
バイト列中の最初の文字が U+FFFE
であるように見える場合、デコードの際にバイトを交換しなければなりません。不運にも文字 U+FEFF
は ZERO WIDTH NO-BREAK SPACE
として別の目的を持っていました: 幅を持たず、単語を分割することを許容しない文字。それは、例えばリガチャアルゴリズムにヒントを与えるために使用することができます。 Unicode 4.0 で、ZERO WIDTH NO-BREAK SPACE
としての U+FEFF
の使用は廃止予定になりました (この役割は U+2060
(WORD JOINER
) によって引き継がれました)。しかしながら、 Unicode ソフトウェアは、依然として両方の役割の U+FEFF
を扱うことができなければなりません: BOM として、エンコードされたバイトのメモリレイアウトを決定する手段であり、一旦バイト列が文字列にデコードされたならば消えます; ZERO WIDTH NO-BREAK SPACE
として、他の任意の文字のようにデコードされる通常の文字です。
さらにもう一つ Unicode 文字全てをエンコードできるエンコーディングがあり、UTF-8 と呼ばれています。UTF-8 は8ビットエンコーディングで、したがって UTF-8 にはバイト順の問題はありません。UTF-8 バイト列の各バイトは二つのパートから成ります。二つはマーカ(上位数ビット)とペイロードです。マーカは0ビットから4ビットの 1
の列に 0
のビットが一つ続いたものです。Unicode 文字は次のようにエンコードされます (x はペイロードを表わし、連結されると一つの Unicode 文字を表わします):
範囲 |
エンコーディング |
---|---|
U-00000000 ... U-0000007F |
0xxxxxxx |
U-00000080 ... U-000007FF |
110xxxxx 10xxxxxx |
U-00000800 ... U-0000FFFF |
1110xxxx 10xxxxxx 10xxxxxx |
U-00010000 ... U-0010FFFF |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Unicode 文字の最下位ビットとは最も右にある x のビットです。
UTF-8 は8ビットエンコーディングなので BOM は必要とせず、デコードされた文字列中の U+FEFF
は(たとえ最初の文字であったとしても) ZERO WIDTH NO-BREAK SPACE
として扱われます。
外部からの情報無しには、文字列のエンコーディングにどのエンコーディングが使われたのか信頼できる形で決定することは不可能です。どの charmap エンコーディングもどんなランダムなバイト列でもデコードできます。しかし UTF-8 ではそれは可能ではありません。任意のバイト列を許さないような構造を持っているからです。UTF-8 エンコーディングであることを検知する信頼性を向上させるために、Microsoft は Notepad プログラム用に UTF-8 の変種 (Python 2.5 では "utf-8-sig"
と呼んでいます) を考案しました。Unicode 文字がファイルに書き込まれる前に UTF-8 でエンコードした BOM (バイト列では 0xef
, 0xbb
, 0xbf
のように見えます) が書き込まれます。このようなバイト値で charmap エンコードされたファイルが始まることはほとんどあり得ない (たとえば iso-8859-1 では
LATIN SMALL LETTER I WITH DIAERESISRIGHT-POINTING DOUBLE ANGLE QUOTATION MARKINVERTED QUESTION MARK
のようになる)ので、utf-8-sig
エンコーディングがバイト列から正しく推測される確率を高めます。つまりここでは BOM はバイト列を生成する際のバイト順を決定できるように使われているのではなく、エンコーディングを推測する助けになる印として使われているのです。utf-8-sig
codec はエンコーディングの際ファイルに最初の3文字として 0xef
, 0xbb
, 0xbf
を書き込みます。デコーディングの際はファイルの先頭に現れたこれら3バイトはスキップします。UTF-8 では BOM の使用は推奨されておらず、一般的には避けるべきです。
7.2.3. 標準エンコーディング¶
Python には数多くの codec が組み込みで付属します。これらは C 言語の関数、対応付けを行うテーブルの両方で提供されています。以下のテーブルでは codec と、いくつかの良く知られている別名と、エンコーディングが使われる言語を列挙します。別名のリスト、言語のリストともしらみつぶしに網羅されているわけではありません。大文字と小文字、またはアンダースコアの代りにハイフンにしただけの綴りも有効な別名です; そのため、例えば 'utf-8'
は 'utf_8'
codec の正当な別名です。
CPython 実装の詳細: いくつかの一般的なエンコーディングは、パフォーマンスを改善するために codec の検索機構を回避することがあります。これらの最適化の機会は、制限された別名のセットに対して CPython でのみ認識されます: utf-8, utf8, latin-1, latin1, iso-8859-1, mbcs (Windows のみ), ascii, utf-16, utf-32。これらのエンコーディングに対する別名を使用することは、実行時間の低下を招くかもしれません。
多くの文字セットは同じ言語をサポートしています。これらの文字セットは個々の文字 (例えば、EURO SIGN がサポートされているかどうか) や、文字のコード部分への割り付けが異なります。特に欧州言語では、典型的に以下の変種が存在します:
ISO 8859 コードセット
Microsoft Windows コードページで、8859 コード形式から導出されているが、制御文字を追加のグラフィック文字と置き換えたもの
IBM EBCDIC コードページ
ASCII 互換の IBM PC コードページ
Codec | 別名 |
言語 |
---|---|---|
ascii | 646, us-ascii | 英語 |
big5 | big5-tw, csbig5 | 繁体字中国語 |
big5hkscs | big5-hkscs, hkscs | 繁体字中国語 |
cp037 | IBM037, IBM039 | 英語 |
cp273 | 273, IBM273, csIBM273 | ドイツ語 バージョン 3.4 で追加. |
cp424 | EBCDIC-CP-HE, IBM424 | ヘブライ語 |
cp437 | 437, IBM437 | 英語 |
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | 西ヨーロッパ言語 |
cp720 | アラビア語 |
|
cp737 | ギリシャ語 |
|
cp775 | IBM775 | バルト沿岸国 |
cp850 | 850, IBM850 | 西ヨーロッパ言語 |
cp852 | 852, IBM852 | 中央および東ヨーロッパ |
cp855 | 855, IBM855 | ブルガリア、ベラルーシ、マケドニア、ロシア、セルビア |
cp856 | ヘブライ語 |
|
cp857 | 857, IBM857 | トルコ語 |
cp858 | 858, IBM858 | 西ヨーロッパ言語 |
cp860 | 860, IBM860 | ポルトガル語 |
cp861 | 861, CP-IS, IBM861 | アイスランド語 |
cp862 | 862, IBM862 | ヘブライ語 |
cp863 | 863, IBM863 | カナダ |
cp864 | IBM864 | アラビア語 |
cp865 | 865, IBM865 | デンマーク、ノルウェー |
cp866 | 866, IBM866 | ロシア語 |
cp869 | 869, CP-GR, IBM869 | ギリシャ語 |
cp874 | タイ語 |
|
cp875 | ギリシャ語 |
|
cp932 | 932, ms932, mskanji, ms-kanji | 日本語 |
cp949 | 949, ms949, uhc | 韓国語 |
cp950 | 950, ms950 | 繁体字中国語 |
cp1006 | Urdu | |
cp1026 | ibm1026 | トルコ語 |
cp1125 | 1125, ibm1125, cp866u, ruscii | ウクライナ語 バージョン 3.4 で追加. |
cp1140 | ibm1140 | 西ヨーロッパ言語 |
cp1250 | windows-1250 | 中央および東ヨーロッパ |
cp1251 | windows-1251 | ブルガリア、ベラルーシ、マケドニア、ロシア、セルビア |
cp1252 | windows-1252 | 西ヨーロッパ言語 |
cp1253 | windows-1253 | ギリシャ語 |
cp1254 | windows-1254 | トルコ語 |
cp1255 | windows-1255 | ヘブライ語 |
cp1256 | windows-1256 | アラビア語 |
cp1257 | windows-1257 | バルト沿岸国 |
cp1258 | windows-1258 | ベトナム |
cp65001 | Windows のみ: Windows UTF-8 ( バージョン 3.3 で追加. |
|
euc_jp | eucjp, ujis, u-jis | 日本語 |
euc_jis_2004 | jisx0213, eucjis2004 | 日本語 |
euc_jisx0213 | eucjisx0213 | 日本語 |
euc_kr | euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 | 韓国語 |
gb2312 | chinese, csiso58gb231280, euc- cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso- ir-58 | 簡体字中国語 |
gbk | 936, cp936, ms936 | Unified Chinese |
gb18030 | gb18030-2000 | Unified Chinese |
hz | hzgb, hz-gb, hz-gb-2312 | 簡体字中国語 |
iso2022_jp | csiso2022jp, iso2022jp, iso-2022-jp | 日本語 |
iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | 日本語 |
iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | 日本語, 韓国語, 簡体字中国語, 西欧, ギリシャ語 |
iso2022_jp_2004 | iso2022jp-2004, iso-2022-jp-2004 | 日本語 |
iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | 日本語 |
iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | 日本語 |
iso2022_kr | csiso2022kr, iso2022kr, iso-2022-kr | 韓国語 |
latin_1 | iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 | 西ヨーロッパ |
iso8859_2 | iso-8859-2, latin2, L2 | 中央および東ヨーロッパ |
iso8859_3 | iso-8859-3, latin3, L3 | エスペラント、マルタ |
iso8859_4 | iso-8859-4, latin4, L4 | バルト沿岸国 |
iso8859_5 | iso-8859-5, cyrillic | ブルガリア、ベラルーシ、マケドニア、ロシア、セルビア |
iso8859_6 | iso-8859-6, arabic | アラビア語 |
iso8859_7 | iso-8859-7, greek, greek8 | ギリシャ語 |
iso8859_8 | iso-8859-8, hebrew | ヘブライ語 |
iso8859_9 | iso-8859-9, latin5, L5 | トルコ語 |
iso8859_10 | iso-8859-10, latin6, L6 | 北欧語 |
iso8859_11 | iso-8859-11, thai | タイ語 |
iso8859_13 | iso-8859-13, latin7, L7 | バルト沿岸国 |
iso8859_14 | iso-8859-14, latin8, L8 | ケルト語 |
iso8859_15 | iso-8859-15, latin9, L9 | 西ヨーロッパ言語 |
iso8859_16 | iso-8859-16, latin10, L10 | 南東ヨーロッパ |
johab | cp1361, ms1361 | 韓国語 |
koi8_r | ロシア語 |
|
koi8_t | タジク バージョン 3.5 で追加. |
|
koi8_u | ウクライナ語 |
|
kz1048 | kz_1048, strk1048_2002, rk1048 | カザフ バージョン 3.5 で追加. |
mac_cyrillic | maccyrillic | ブルガリア、ベラルーシ、マケドニア、ロシア、セルビア |
mac_greek | macgreek | ギリシャ語 |
mac_iceland | maciceland | アイスランド語 |
mac_latin2 | maclatin2, maccentraleurope | 中央および東ヨーロッパ |
mac_roman | macroman, macintosh | 西ヨーロッパ言語 |
mac_turkish | macturkish | トルコ語 |
ptcp154 | csptcp154, pt154, cp154, cyrillic-asian | カザフ |
shift_jis | csshiftjis, shiftjis, sjis, s_jis | 日本語 |
shift_jis_2004 | shiftjis2004, sjis_2004, sjis2004 | 日本語 |
shift_jisx0213 | shiftjisx0213, sjisx0213, s_jisx0213 | 日本語 |
utf_32 | U32, utf32 | 全ての言語 |
utf_32_be | UTF-32BE | 全ての言語 |
utf_32_le | UTF-32LE | 全ての言語 |
utf_16 | U16, utf16 | 全ての言語 |
utf_16_be | UTF-16BE | 全ての言語 |
utf_16_le | UTF-16LE | 全ての言語 |
utf_7 | U7, unicode-1-1-utf-7 | 全ての言語 |
utf_8 | U8, UTF, utf8 | 全ての言語 |
utf_8_sig | 全ての言語 |
バージョン 3.4 で変更: utf-16* と utf-32* のエンコーダは、サロゲートコードポイント (U+D800
–U+DFFF
) がエンコードされることを許可しなくなりました。utf-32* デコーダは、サロゲートコードポイントに対応するバイト列をデコードしなくなりました。
7.2.4. Python 特有のエンコーディング¶
予め定義された codec のいくつかは Python 特有のものなので、それらの codec 名は Python の外では無意味なものとなります。以下に、想定されている入出力のタイプに基づいて、それらを表にしました(テキストエンコーディングは codec の最も一般的な使用例ですが、その根底にある codec 基盤は、ただのテキストエンコーディングというよりも、任意のデータの変換をサポートしていることに注意してください)。非対称的な codec については、その目的がエンコーディングの方向を説明しています。
7.2.4.1. テキストエンコーディング¶
次の codec では、 Unicode におけるテキストエンコーディングと同様に、 str
から bytes
へのエンコードと、 bytes-like object から str
へのデコードを提供します。
Codec | 別名 |
目的 |
---|---|---|
idna | RFC 3490 の実装です。 |
|
mbcs | dbcs | Windows のみ: 被演算子を ANSI コードページ (CP_ACP) に従ってエンコードします |
palmos | PalmOS 3.5 のエンコーディングです |
|
punycode | RFC 3492 の実装です。ステートフル codecs は、サポートされません。 |
|
raw_unicode_escape | 別のコードポイントに |
|
undefined | 空文字列を含む全ての変換に対して例外を送出します。エラーハンドラは無視されます。 |
|
unicode_escape | ASCII でエンコードされた Python ソースコード内の、Unicode リテラルに適したエンコーディングです。ただし、引用符はエスケープされません。Latin-1 ソースコードからデコードします。実際には、Python のソースコードはデフォルトでは UTF-8 を使用することに注意してください。 |
|
unicode_internal | 被演算子の内部表現を返します。ステートフル codecs は、サポートされません。 バージョン 3.3 で撤廃: この表現は PEP 393 により廃止されました。 |
7.2.4.2. バイナリ変換 (Binary Transforms)¶
以下の codec は、bytes-like object から bytes
マッピングへのバイナリ変換を提供します。bytes.decode()
はこの変換をサポートしておらず、 str
を出力するだけです。
Codec | 別名 |
目的 |
エンコーダ / デコーダ |
---|---|---|---|
base64_codec [1] | base64, base_64 | 被演算子をマルチラインの MIME base64 に変換します (結果は常に末尾の バージョン 3.4 で変更: 任意の bytes-like object をエンコードとデコード用の入力として受け取ります。 |
base64.encodebytes() /
base64.decodebytes() |
bz2_codec | bz2 | 被演算子をbz2を使って圧縮します |
bz2.compress() /
bz2.decompress() |
hex_codec | hex | 被演算子をバイトあたり 2 桁の 16 進数の表現に変換します |
binascii.b2a_hex() /
binascii.a2b_hex() |
quopri_codec | quopri, quotedprintable, quoted_printable | 被演算子を MIME quoted printable 形式に変換します |
|
uu_codec | uu | 被演算子を uuencode を用いて変換します |
uu.encode() /
uu.decode() |
zlib_codec | zip, zlib | 被演算子を gzip を用いて圧縮します |
zlib.compress() /
zlib.decompress() |
[1] | バイト様オブジェクト に加えて、 |
バージョン 3.2 で追加: バイナリ変換が復活しました。(訳注: 2.x にはあったものが 3.0 で削除されていた。)
バージョン 3.4 で変更: バイナリ変換のエイリアスが復活しました。(訳注: 2.x にはあったエイリアス。3.2 でエイリアスは復活しなかった。)
7.2.4.3. テキスト変換 (Text Transforms)¶
以下の codec は、str
から str
マッピングへのテキスト変換を提供します。str.encode()
はこの変換をサポートしておらず、 bytes
を出力するだけです。
Codec | 別名 |
目的 |
---|---|---|
rot_13 | rot13 | 被演算子のシーザー暗号 (Caesar-cypher) を返します |
バージョン 3.2 で追加: rot_13
テキスト変換が復活しました。(訳注: 2.x にはあったものが 3.0 で削除されていた。)
バージョン 3.4 で変更: rot13
エイリアスが復活しました。(訳注: 2.x にはあったエイリアス。3.2 でエイリアスは復活しなかった。)
7.2.5. encodings.idna
— アプリケーションにおける国際化ドメイン名 (IDNA)¶
このモジュールでは 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 間の変換を行い、入力文字列を RFC 3490 の section 3.1 (1) で定義されている区切り文字に基づいてラベルに分解し、各ラベルを要求通りに ACE に変換します。逆に、入力のバイト文字列を .
区切り文字でラベルに分解し、 ACE ラベルを Unicode に変換します。さらに、 socket
モジュールは Unicode ホスト名を ACE に透過的に変換するため、アプリケーションはホスト名を socket
モジュールに渡す際にホスト名の変換に煩わされることがありません。その上で、ホスト名を関数パラメタとして持つ、 http.client
や ftplib
のようなモジュールでは Unicode ホスト名を受理します (http.client
でもまた、 Host フィールドにある IDNA ホスト名を、フィールド全体を送信する場合に透過的に送信します)。
(逆引きなどによって) ネットワーク越しにホスト名を受信する際、Unicode への自動変換は行われません: こうしたホスト名をユーザに提供したいアプリケーションでは、Unicode にデコードしてやる必要があります。
encodings.idna
ではまた、 nameprep 手続きを実装しています。 nameprep はホスト名に対してある正規化を行って、国際化ドメイン名で大小文字を区別しないようにするとともに、類似の文字を一元化します。 nameprep 関数は必要なら直接使うこともできます。
-
encodings.idna.
nameprep
(label)¶ label を nameprep したバージョンを返します。現在の実装ではクエリ文字列を仮定しているので、
AllowUnassigned
は真です。
7.2.6. encodings.mbcs
— Windows ANSI コードページ¶
ANSI コードページ (CP_ACP) に対応するエンコードオペランド。
利用可能な環境: Windows のみ。
バージョン 3.3 で変更: 任意のエラーハンドラのサポート。
バージョン 3.2 で変更: 3.2 以前は errors 引数は無視されました; エンコードには常に 'replace'
が、デコードには 'ignore'
が使われました。
7.2.7. encodings.utf_8_sig
— BOM 印付き UTF-8¶
このモジュールは UTF-8 codec の変種を実装します。エンコーディング時は、UTF-8 でエンコードしたバイト列の前に UTF-8 でエンコードした BOM を追加します。これは内部状態を持つエンコーダで、この動作は (バイトストリームの最初の書き込み時に) 一度だけ行なわれます。デコーディング時は、データの最初に UTF-8 でエンコードされた BOM があれば、それをスキップします。