7.2. codecs — codec レジストリと基底クラス

ソースコード: Lib/codecs.py

This module defines base classes for standard Python codecs (encoders and decoders) and provides access to the internal Python codec registry, which manages the codec and error handling lookup process. Most standard codecs are text encodings, which encode text to bytes, but there are also codecs provided that encode text to text, and bytes to bytes. Custom codecs may encode and decode between arbitrary types, but some module features are restricted to use specifically with text encodings, or with codecs that encode to bytes.

The module defines the following functions for encoding and decoding with any 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 基底クラス を参照してください。

The full details for each codec can also be looked up directly:

codecs.lookup(encoding)

Looks up the codec info in the Python codec registry and returns a CodecInfo object as defined below.

エンコーディングの検索は、まずレジストリのキャッシュから行います。見つからなければ、登録されている検索関数のリストから探します。 CodecInfo オブジェクトが一つも見つからなければ LookupError を送出します。見つかったら、その CodecInfo オブジェクトはキャッシュに保存され、呼び出し側に返されます。

class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)

Codec details when looking up the codec registry. The constructor arguments are stored in attributes of the same name:

name

The name of the encoding.

encode
decode

The stateless encoding and decoding functions. These must be functions or methods which have the same interface as the encode() and decode() methods of Codec instances (see Codec Interface). The functions or methods are expected to work in a stateless mode.

incrementalencoder
incrementaldecoder

Incremental encoder and decoder classes or factory functions. These have to provide the interface defined by the base classes IncrementalEncoder and IncrementalDecoder, respectively. Incremental codecs can maintain state.

streamwriter
streamreader

Stream writer and reader classes or factory functions. These have to provide the interface defined by the base classes StreamWriter and StreamReader, respectively. Stream codecs can maintain state.

さまざまな 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 を送出します。

Custom codecs are made available by registering a suitable codec search function:

codecs.register(search_function)

Register a codec search function. Search functions are expected to take one argument, being the encoding name in all lower case letters, and return a CodecInfo object. In case a search function cannot find a given encoding, it should return None.

注釈

Search function registration is not currently reversible, which may cause problems in some cases, such as unit testing or module reloading.

While the builtin open() and the associated io module are the recommended approach for working with encoded text files, this module provides additional utility functions and classes that allow the use of a wider range of codecs when working with binary files:

codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)

エンコードされたファイルを mode を使って開き、透過的なエンコード/デコードを提供する StreamReaderWriter のインスタンスを返します。デフォルトのファイルモードは 'r' 、つまり、読み出しモードでファイルを開きます。

注釈

Underlying encoded files are always opened in binary mode. No automatic conversion of '\n' is done on reading and writing. The mode argument may be any binary mode acceptable to the built-in open() function; the 'b' is automatically added.

encoding specifies the encoding which is to be used for the file. Any encoding that encodes to and decodes from bytes is allowed, and the data types supported by the file methods depend on the codec used.

エラーハンドリングのために errors を渡すことができます。これはデフォルトでは 'strict' で、エンコード時にエラーがあれば ValueError を送出します。

buffering は組み込み関数 open() の場合と同じ意味を持ちます。デフォルトでは行バッファリングです。

codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')

Return a StreamRecoder instance, a wrapped version of file which provides transparent transcoding. The original file is closed when the wrapped version is closed.

Data written to the wrapped file is decoded according to the given data_encoding and then written to the original file as bytes using file_encoding. Bytes read from the original file are decoded according to file_encoding, and the result is encoded using data_encoding.

file_encoding が与えられなければ、data_encoding がデフォルトになります。

エラーハンドリングのために errors を渡すことができます。これはデフォルトでは 'strict' で、エンコード時にエラーがあれば ValueError を送出します。

codecs.iterencode(iterator, encoding, errors='strict', **kwargs)

Uses an incremental encoder to iteratively encode the input provided by iterator. This function is a generator. The errors argument (as well as any other keyword argument) is passed through to the incremental encoder.

codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)

Uses an incremental decoder to iteratively decode the input provided by iterator. This function is a generator. The errors argument (as well as any other keyword argument) is passed through to the incremental decoder.

このモジュールは以下のような定数も定義しています。プラットフォーム依存なファイルを読み書きするのに役立ちます:

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

These constants define various byte sequences, being Unicode byte order marks (BOMs) for several encodings. They are used in UTF-16 and UTF-32 data streams to indicate the byte order used, and in UTF-8 as a Unicode signature. BOM_UTF16 is either BOM_UTF16_BE or BOM_UTF16_LE depending on the platform’s native byte order, BOM is an alias for BOM_UTF16, BOM_LE for BOM_UTF16_LE and BOM_BE for BOM_UTF16_BE. The others represent the BOM in UTF-8 and UTF-32 encodings.

7.2.1. Codec 基底クラス

The codecs module defines a set of base classes which define the interfaces for working with codec objects, and can also be used as the basis for custom codec implementations.

Each codec has to define four interfaces to make it usable as codec in Python: stateless encoder, stateless decoder, stream reader and stream writer. The stream reader and writers typically reuse the stateless encoder/decoder to implement the file protocols. Codec authors also need to define how the codec will handle encoding and decoding errors.

7.2.1.1. Error Handlers

エラー処理の簡便化と標準化のため、コーデックは、errors 文字列引数を指定した場合に別のエラー処理を行うような仕組みを実装してもかまいません。全ての標準 Python codec では以下の文字列が定義され、実装されています:

意味

'strict'

UnicodeError (または、そのサブクラス) を送出します – デフォルトの動作です。 strict_errors() で実装されています。

'ignore' Ignore the malformed data and continue without further notice. Implemented in ignore_errors().

The following error handlers are only applicable to text encodings:

意味

'replace'

適当な置換マーカーで置換します – Python の組み込み Unicode codec のデコード時には公式の U+FFFD REPLACEMENT CHARACTER を、エンコード時には ‘?’ を使います。 replace_errors() で実装されています。

'xmlcharrefreplace'

適切な XML 文字参照で置換します (エンコードのみ)。 xmlcharrefreplace_errors() で実装されています。

'backslashreplace' Replace with backslashed escape sequences. Implemented in backslashreplace_errors().
'namereplace' Replace with \N{...} escape sequences (only for encoding). Implemented in namereplace_errors().
'surrogateescape' On decoding, replace byte with individual surrogate code ranging from U+DC80 to U+DCFF. This code will then be turned back into the same byte when the 'surrogateescape' error handler is used when encoding the data. (See PEP 383 for more.)

さらに、次のエラーハンドラは与えられた codec に特有です:

Codecs

意味

'surrogatepass' utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le Allow encoding and decoding of surrogate codes. These codecs normally treat the presence of surrogates as an error.

バージョン 3.1 で追加: 'surrogateescape' および 'surrogatepass' エラーハンドラ。

バージョン 3.4 で変更: 'surrogatepass' エラーハンドラは utf-16* コーデックと utf-32* コーデックで動作するようになりました。

バージョン 3.5 で追加: The 'namereplace' error handler.

バージョン 3.5 で変更: The 'backslashreplace' error handlers now works with decoding and translating.

The set of allowed values can be extended by registering a new named error handler:

codecs.register_error(name, error_handler)

Register the error handling function error_handler under the name name. The error_handler argument will be called during encoding and decoding in case of an error, when name is specified as the errors parameter.

For encoding, error_handler will be called with a UnicodeEncodeError instance, which contains information about the location of the error. The error handler must either raise this or a different exception, or return a tuple with a replacement for the unencodable part of the input and a position where encoding should continue. The replacement may be either str or bytes. If the replacement is bytes, the encoder will simply copy them into the output buffer. If the replacement is a string, the encoder will encode the replacement. Encoding continues on original input at the specified position. Negative position values will be treated as being relative to the end of the input string. If the resulting position is out of bound an IndexError will be raised.

Decoding and translating works similarly, except UnicodeDecodeError or UnicodeTranslateError will be passed to the handler and that the replacement from the error handler will be put into the output directly.

Previously registered error handlers (including the standard error handlers) can be looked up by name:

codecs.lookup_error(name)

名前 name で登録済みのエラー処理関数を返します。

エラー処理関数が見つからなければ LookupError を送出します。

The following standard error handlers are also made available as module level functions:

codecs.strict_errors(exception)

Implements the 'strict' error handling: each encoding or decoding error raises a UnicodeError.

codecs.replace_errors(exception)

Implements the 'replace' error handling (for text encodings only): substitutes '?' for encoding errors (to be encoded by the codec), and '\ufffd' (the Unicode replacement character) for decoding errors.

codecs.ignore_errors(exception)

Implements the 'ignore' error handling: malformed data is ignored and encoding or decoding is continued without further notice.

codecs.xmlcharrefreplace_errors(exception)

Implements the 'xmlcharrefreplace' error handling (for encoding with text encodings only): the unencodable character is replaced by an appropriate XML character reference.

codecs.backslashreplace_errors(exception)

Implements the 'backslashreplace' error handling (for text encodings only): malformed data is replaced by a backslashed escape sequence.

codecs.namereplace_errors(exception)

Implements the 'namereplace' error handling (for encoding with text encodings only): the unencodable character is replaced by a \N{...} escape sequence.

バージョン 3.5 で追加.

7.2.1.2. Stateless Encoding and Decoding

基底の Codec クラスは以下のメソッドを定義します。これらのメソッドは、内部状態を持たないエンコーダ/デコーダ関数のインタフェースを定義します:

Codec.encode(input[, errors])

オブジェクト input エンコードし、(出力オブジェクト, 消費した長さ) のタプルを返します。例えば、 text encoding は文字列オブジェクトを特有の文字セット (例えば cp1252iso-8859-1) を用いてバイト列オブジェクトに変換します。

errors 引数は適用するエラー処理を定義します。'strict' 処理がデフォルトです。

このメソッドは Codec に内部状態を保存してはなりません。効率よくエンコードするために状態を保持しなければならないような codecs には StreamWriter を使ってください。

エンコーダは長さが 0 の入力を処理できなければなりません。この場合、空のオブジェクトを出力オブジェクトとして返さなければなりません。

Codec.decode(input[, errors])

オブジェクト input をデコードし、(出力オブジェクト, 消費した長さ) のタプルを返します。例えば、 text encoding は、は特定の文字集合エンコーディングでエンコードされたバイト列オブジェクトを文字列オブジェクトに変換します。

For text encodings and bytes-to-bytes codecs, input must be a bytes object or one which provides the read-only buffer interface – for example, buffer objects and memory mapped files.

errors 引数は適用するエラー処理を定義します。'strict' 処理がデフォルトです。

このメソッドは、 Codec インスタンスに内部状態を保存してはなりません。効率よくエンコード/デコードするために状態を保持しなければならないような codecs には StreamReader を使ってください。

デコーダは長さが 0 の入力を処理できなければなりません。この場合、空のオブジェクトを出力オブジェクトとして返さなければなりません。

7.2.1.3. Incremental Encoding and Decoding

IncrementalEncoder クラスおよび IncrementalDecoder クラスはそれぞれ漸増的エンコーディングおよびデコーディングのための基本的なインタフェースを提供します。エンコーディング/デコーディングは内部状態を持たないエンコーダ/デコーダを一度呼び出すことで行なわれるのではなく、漸増的エンコーダ/デコーダの encode()/decode() メソッドを複数回呼び出すことで行なわれます。漸増的エンコーダ/デコーダはメソッド呼び出しの間エンコーディング/デコーディング処理の進行を管理します。

encode()/decode() メソッド呼び出しの出力結果をまとめたものは、入力をひとまとめにして内部状態を持たないエンコーダ/デコーダでエンコード/デコードしたものと同じになります。

7.2.1.3.1. IncrementalEncoder オブジェクト

IncrementalEncoder クラスは入力を複数ステップでエンコードするのに使われます。全ての漸増的エンコーダが Python codec レジストリと互換性を持つために定義すべきメソッドとして、このクラスには以下のメソッドが定義されています。

class codecs.IncrementalEncoder(errors='strict')

IncrementalEncoder インスタンスのコンストラクタ。

全ての漸増的エンコーダはこのコンストラクタインタフェースを提供しなければなりません。さらにキーワード引数を付け加えるのは構いませんが、Python codec レジストリで利用されるのはここで定義されているものだけです。

IncrementalEncodererrors キーワード引数を提供して異なったエラー取扱方法を実装することもできます。可能な値は Error Handlers を参照してください。

引数 errors は同名の属性に割り当てられます。属性に割り当てることで IncrementalEncoder オブジェクトが生きている間にエラー取扱戦略を違うものに切り替えることができるようになります。

encode(object[, final])

object を(エンコーダの現在の状態を考慮に入れて)エンコードし、得られたエンコードされたオブジェクトを返します。 encode() 呼び出しがこれで最後という時には final は真でなければなりません(デフォルトは偽です)。

reset()

Reset the encoder to the initial state. The output is discarded: call .encode(object, final=True), passing an empty byte or text string if necessary, to reset the encoder and to get the output.

IncrementalEncoder.getstate()

エンコーダの現在の状態を返します。それは必ず整数でなければなりません。実装は、0 が最も一般的な状態であることを保証すべきです (整数より複雑な状態は、状態を marshal/pickle して生じた文字列のバイトを整数にコード化することによって整数に変換することができます)。

IncrementalEncoder.setstate(state)

エンコーダの状態を state にセットします。 stategetstate() によって返されたエンコーダ状態でなければなりません。

7.2.1.3.2. IncrementalDecoder オブジェクト

IncrementalDecoder クラスは入力を複数ステップでデコードするのに使われます。全ての漸増的デコーダが Python codec レジストリと互換性を持つために定義すべきメソッドとして、このクラスには以下のメソッドが定義されています。

class codecs.IncrementalDecoder(errors='strict')

IncrementalDecoder インスタンスのコンストラクタ。

全ての漸増的デコーダはこのコンストラクタインタフェースを提供しなければなりません。さらにキーワード引数を付け加えるのは構いませんが、Python codec レジストリで利用されるのはここで定義されているものだけです。

IncrementalDecodererrors キーワード引数を提供して異なったエラー取扱方法を実装することもできます。可能な値は Error Handlers を参照してください。

引数 errors は同名の属性に割り当てられます。属性に割り当てることで IncrementalDecoder オブジェクトが生きている間にエラー取扱戦略を違うものに切り替えることができるようになります。

decode(object[, final])

object を(デコーダの現在の状態を考慮に入れて)デコードし、得られたデコードされたオブジェクトを返します。 decode() 呼び出しがこれで最後という時には final は真でなければなりません(デフォルトは偽です)。もし final が真ならばデコーダは入力をデコードし切り全てのバッファをフラッシュしなければなりません。そうできない場合(たとえば入力の最後に不完全なバイト列があるから)、デコーダは内部状態を持たない場合と同じようにエラーの取り扱いを開始しなければなりません(例外を送出するかもしれません)。

reset()

デコーダを初期状態にリセットします。

getstate()

デコーダの現在の状態を返します。これは2要素を含むタプルでなければなりません。1番目はまだデコードされていない入力を含むバッファです。2番目は整数で、付加的な状態情報です (実装は 0 が最も一般的な付加的な状態情報であることを保証すべきです)。この付加的な状態情報が 0 である場合、デコーダを入力がバッファされていない状態に戻して、付加的な状態情報を 0 にセットすることが可能でなければなりません。その結果、以前バッファされた入力をデコーダに与えることで、何の出力もせずにデコーダを前の状態に戻します。 (整数より複雑な付加的な状態情報は、情報を marshal/pickle して、結果として生じる文字列のバイト列を整数にエンコードすることで、整数に変換することができます。)

setstate(state)

エンコーダ (訳注: デコーダの間違い?) の状態を state にセットします。 stategetstate() によって返されたデコーダ状態でなければなりません。

7.2.1.4. Stream Encoding and Decoding

StreamWriterStreamReader クラスは、新しいエンコーディングモジュールを、非常に簡単に実装するのに使用できる、一般的なインターフェイス提供します。実装例は encodings.utf_8 をご覧ください。

7.2.1.4.1. StreamWriter オブジェクト

StreamWriter クラスは Codec のサブクラスで、以下のメソッドを定義しています。全てのストリームライタは、 Python の codec レジストリとの互換性を保つために、これらのメソッドを定義する必要があります。

class codecs.StreamWriter(stream, errors='strict')

StreamWriter インスタンスのコンストラクタです。

全てのストリームライタはコンストラクタとしてこのインタフェースを提供しなければなりません。キーワード引数を追加しても構いませんが、Python の codec レジストリはここで定義されている引数だけを使います。

The stream argument must be a file-like object open for writing text or binary data, as appropriate for the specific codec.

The StreamWriter may implement different error handling schemes by providing the errors keyword argument. See Error Handlers for the standard error handlers the underlying stream codec may support.

errors 引数は、同名の属性に代入されます。この属性を変更すると、 StreamWriter オブジェクトが生きている間に、異なるエラー処理に変更できます。

write(object)

object の内容をエンコードしてストリームに書き出します。

writelines(list)

Writes the concatenated list of strings to the stream (possibly by reusing the write() method). The standard bytes-to-bytes codecs do not support this method.

reset()

状態保持に使われていた codec のバッファを強制的に出力してリセットします。

このメソッドが呼び出された場合、出力先データをきれいな状態にし、わざわざストリーム全体を再スキャンして状態を元に戻さなくても新しくデータを追加できるようにしなければなりません。

ここまでで挙げたメソッドの他にも、 StreamWriter では背後にあるストリームの他の全てのメソッドや属性を継承しなければなりません。

7.2.1.4.2. StreamReader オブジェクト

StreamReader クラスは Codec のサブクラスで、以下のメソッドを定義しています。全てのストリームリーダは、 Python の codec レジストリとの互換性を保つために、これらのメソッドを定義する必要があります。

class codecs.StreamReader(stream, errors='strict')

StreamReader インスタンスのコンストラクタです。

全てのストリームリーダはコンストラクタとしてこのインタフェースを提供しなければなりません。キーワード引数を追加しても構いませんが、Python の codec レジストリはここで定義されている引数だけを使います。

The stream argument must be a file-like object open for reading text or binary data, as appropriate for the specific codec.

The StreamReader may implement different error handling schemes by providing the errors keyword argument. See Error Handlers for the standard error handlers the underlying stream codec may support.

errors 引数は、同名の属性に代入されます。この属性を変更すると、 StreamReader オブジェクトが生きている間に、異なるエラー処理に変更できます。

errors 引数に許される値の集合は register_error() で拡張できます。

read([size[, chars[, firstline]]])

ストリームからのデータをデコードし、デコード済のオブジェクトを返します。

The chars argument indicates the number of decoded code points or bytes to return. The read() method will never return more data than requested, but it might return less, if there is not enough available.

The size argument indicates the approximate maximum number of encoded bytes or code points to read for decoding. The decoder can modify this setting as appropriate. The default value -1 indicates to read and decode as much as possible. This parameter is intended to prevent having to decode huge files in one step.

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 はファイル類似のオブジェクトです。 ReaderWriter は、それぞれ StreamReaderStreamWriter インタフェースを提供するファクトリ関数かファクトリクラスでなければなりません。エラー処理は、ストリームリーダとライタで定義したものと同じように行われます。

StreamReaderWriter インスタンスは、 StreamReader クラスと StreamWriter クラスを合わせたインタフェースを継承します。元になるストリームからは、他のメソッドや属性を継承します。

7.2.1.4.4. StreamRecoder オブジェクト

StreamRecoder はデータをあるエンコーディングから別のエンコーディングに変換します。異なるエンコーディング環境を扱うとき、便利な場合があります。

lookup() 関数が返すファクトリ関数を使って、インスタンスを生成するという設計です。

class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors)

双方向変換を実装する StreamRecoder インスタンスを生成します。 encodedecode はフロントエンド (read() および write() を呼び出すコードから見えるデータ) ではたらき、 ReaderWriter はバックエンド (stream 内のデータ) ではたらきます。

You can use these objects to do transparent transcodings from e.g. Latin-1 to UTF-8 and back.

The stream argument must be a file-like object.

The encode and decode arguments must adhere to the Codec interface. Reader and Writer must be factory functions or classes providing objects of the StreamReader and StreamWriter interface respectively.

エラー処理はストリーム・リーダやライタで定義されている方法と同じように行われます。

StreamRecoder インスタンスは、 StreamReaderStreamWriter クラスを合わせたインタフェースを定義します。また、元のストリームのメソッドと属性も継承します。

7.2.2. エンコーディングと Unicode

Strings are stored internally as sequences of code points in range 0x0-0x10FFFF. (See PEP 393 for more details about the implementation.) Once a string object is used outside of CPU and memory, endianness and how these arrays are stored as bytes become an issue. As with other codecs, serialising a string into a sequence of bytes is known as encoding, and recreating the string from the sequence of bytes is known as decoding. There are a variety of different text serialisation codecs, which are collectivity referred to as text encodings.

The simplest text encoding (called 'latin-1' or 'iso-8859-1') maps the code points 0-255 to the bytes 0x0-0xff, which means that a string object that contains code points above U+00FF can’t be encoded with this codec. Doing so will raise a UnicodeEncodeError that looks like the following (although the details of the error message may differ): 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+FEFFZERO 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 DIAERESIS
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
INVERTED 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 の正当な別名です。

いくつかの一般的なエンコーディングは、パフォーマンスを改善するために 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 (CP_UTF8)

バージョン 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 で変更: The utf-16* and utf-32* encoders no longer allow surrogate code points (U+D800U+DFFF) to be encoded. The utf-32* decoders no longer decode byte sequences that correspond to surrogate code points.

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 の実装です。 encodings.idna も参照してください。 errors='strict' のみがサポートされています。

mbcs dbcs

Windows のみ: 被演算子を ANSI コードページ (CP_ACP) に従ってエンコードします

palmos  

PalmOS 3.5 のエンコーディングです

punycode   Implements RFC 3492. Stateful codecs are not supported.
raw_unicode_escape   Latin-1 encoding with \uXXXX and \UXXXXXXXX for other code points. Existing backslashes are not escaped in any way. It is used in the Python pickle protocol.
undefined  

空文字列を含む全ての変換に対して例外を送出します。エラーハンドラは無視されます。

unicode_escape   Encoding suitable as the contents of a Unicode literal in ASCII-encoded Python source code, except that quotes are not escaped. Decodes from Latin-1 source code. Beware that Python source code actually uses UTF-8 by default.
unicode_internal  

Return the internal representation of the operand. Stateful codecs are not supported.

バージョン 3.3 で撤廃: This representation is obsoleted by PEP 393.

7.2.4.2. バイナリ変換 (Binary Transforms)

The following codecs provide binary transforms: bytes-like object to bytes mappings. They are not supported by bytes.decode() (which only produces str output).

Codec

別名

目的

エンコーダ / デコーダ

base64_codec [1] base64, base_64

被演算子をマルチラインの MIME base64 に変換します (結果は常に末尾の '\n' を含みます)

バージョン 3.4 で変更: accepts any bytes-like object as input for encoding and decoding

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 形式に変換します

quopri.encode() with quotetabs=True / quopri.decode()
uu_codec uu

被演算子を uuencode を用いて変換します

uu.encode() / uu.decode()
zlib_codec zip, zlib

被演算子を gzip を用いて圧縮します

zlib.compress() / zlib.decompress()
[1]In addition to bytes-like objects, 'base64_codec' also accepts ASCII-only instances of str for decoding

バージョン 3.2 で追加: バイナリ変換が復活しました。(訳注: 2.x にはあったものが 3.0 で削除されていた。)

バージョン 3.4 で変更: バイナリ変換のエイリアスが復活しました。(訳注: 2.x にはあったエイリアス。3.2 でエイリアスは復活しなかった。)

7.2.4.3. テキスト変換 (Text Transforms)

The following codec provides a text transform: a str to str mapping. It is not supported by str.encode() (which only produces bytes output).

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 3490section 3.1 (1) で定義されている区切り文字に基づいてラベルに分解し、各ラベルを要求通りに ACE に変換します。逆に、入力のバイト文字列を . 区切り文字でラベルに分解し、 ACE ラベルを Unicode に変換します。さらに、 socket モジュールは Unicode ホスト名を ACE に透過的に変換するため、アプリケーションはホスト名を socket モジュールに渡す際にホスト名の変換に煩わされることがありません。その上で、ホスト名を関数パラメタとして持つ、 http.clientftplib のようなモジュールでは Unicode ホスト名を受理します (http.client でもまた、 Host フィールドにある IDNA ホスト名を、フィールド全体を送信する場合に透過的に送信します)。

(逆引きなどによって) ネットワーク越しにホスト名を受信する際、Unicode への自動変換は行われません: こうしたホスト名をユーザに提供したいアプリケーションでは、Unicode にデコードしてやる必要があります。

encodings.idna ではまた、 nameprep 手続きを実装しています。 nameprep はホスト名に対してある正規化を行って、国際化ドメイン名で大小文字を区別しないようにするとともに、類似の文字を一元化します。 nameprep 関数は必要なら直接使うこともできます。

encodings.idna.nameprep(label)

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

encodings.idna.ToASCII(label)

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

encodings.idna.ToUnicode(label)

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

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 があれば、それをスキップします。