"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
(and decode bytes to text), 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 be used specifically with *text encodings* or with
codecs that encode to "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)

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

   バージョン 3.9 で変更: Hyphens and spaces are converted to
   underscore.

   注釈:

     現在、検索関数の登録は不可逆的です。このため、ユニットテストやモ
     ジュールの再ロード時などに問題が生じることがあります。

エンコードされたテキストファイルを処理する場合、組み込みの "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* has the same meaning as for the built-in "open()"
   function. It defaults to -1 which means that the default buffer
   size will be used.

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 を表します。


Codec 基底クラス
================

"codecs" モジュールは、 codec オブジェクトを操作するインターフェースを
定義する一連の基底クラスを定義します。このモジュールは、カスタムの
codec の実装の基礎として使用することもできます。

Python で codec として使えるようにするには、ステートレスエンコーダ、ス
テートレスデコーダ、ストリームリーダ、ストリームライタの 4 つのインタ
ーフェースを定義する必要があります。通常は、ストリームリーダとライタは
ステートレスエンコーダとデコーダを再利用して、ファイルプロトコルを実装
します。codec の作者は、codec がエンコードとデコードのエラーの処理方法
も定義する必要があります。


エラーハンドラ
--------------

To simplify and standardize error handling, codecs may implement
different error handling schemes by accepting the *errors* string
argument:

>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace')
b'German \\xdf, \\u266c'
>>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace')
b'German &#223;, &#9836;'

The following error handlers can be used with all Python 標準エンコー
ディング codecs:

+---------------------------+-------------------------------------------------+
| 値                        | 意味                                            |
|===========================|=================================================|
| "'strict'"                | Raise "UnicodeError" (or a subclass), this is   |
|                           | the default. Implemented in "strict_errors()".  |
+---------------------------+-------------------------------------------------+
| "'ignore'"                | 不正な形式のデータを無視し、何も通知することな  |
|                           | く処理を継続します。 "ignore_errors()" で実装さ |
|                           | れています。                                    |
+---------------------------+-------------------------------------------------+
| "'replace'"               | Replace with a replacement marker. On encoding, |
|                           | use "?" (ASCII character). On decoding, use "�" |
|                           | (U+FFFD, the official REPLACEMENT CHARACTER).   |
|                           | Implemented in "replace_errors()".              |
+---------------------------+-------------------------------------------------+
| "'backslashreplace'"      | Replace with backslashed escape sequences. On   |
|                           | encoding, use hexadecimal form of Unicode code  |
|                           | point with formats "\xhh" "\uxxxx"              |
|                           | "\Uxxxxxxxx". On decoding, use hexadecimal form |
|                           | of byte value with format "\xhh". Implemented   |
|                           | in "backslashreplace_errors()".                 |
+---------------------------+-------------------------------------------------+
| "'surrogateescape'"       | デコード時には、バイト列を "U+DC80" から        |
|                           | "U+DCFF" の範囲の個々のサロゲ ートコードで置き  |
|                           | 換えます。データのエンコード時に                |
|                           | "'surrogateescape'" エラーハンドラが使用される  |
|                           | と、このコードは同じバイト列に戻されます。 ( 詳 |
|                           | しくは **PEP 383** を参照。)                    |
+---------------------------+-------------------------------------------------+

The following error handlers are only applicable to encoding (within
*text encodings*):

+---------------------------+-------------------------------------------------+
| 値                        | 意味                                            |
|===========================|=================================================|
| "'xmlcharrefreplace'"     | Replace with XML/HTML numeric character         |
|                           | reference, which is a decimal form of Unicode   |
|                           | code point with format "&#num;" Implemented in  |
|                           | "xmlcharrefreplace_errors()".                   |
+---------------------------+-------------------------------------------------+
| "'namereplace'"           | Replace with "\N{...}" escape sequences, what   |
|                           | appears in the braces is the Name property from |
|                           | Unicode Character Database. Implemented in      |
|                           | "namereplace_errors()".                         |
+---------------------------+-------------------------------------------------+

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

+---------------------+--------------------------+---------------------------------------------+
| 値                  | Codecs                   | 意味                                        |
|=====================|==========================|=============================================|
| "'surrogatepass'"   | utf-8, utf-16, utf-32,   | Allow encoding and decoding surrogate code  |
|                     | utf-16-be, utf-16-le,    | point ("U+D800" - "U+DFFF") as normal code  |
|                     | utf-32-be, utf-32-le     | point. Otherwise these codecs treat the     |
|                     |                          | presence of surrogate code point in "str"   |
|                     |                          | as an error.                                |
+---------------------+--------------------------+---------------------------------------------+

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

バージョン 3.4 で変更: The "'surrogatepass'" error handler now works
with utf-16* and utf-32* codecs.

バージョン 3.5 で追加: "'namereplace'" エラーハンドラです。

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

次のように、名前付きの新しいエラーハンドラを登録することで、許可される
値の集合を拡張することができます。

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)

   Implements the "'strict'" error handling.

   Each encoding or decoding error raises a "UnicodeError".

codecs.ignore_errors(exception)

   Implements the "'ignore'" error handling.

   Malformed data is ignored; encoding or decoding is continued
   without further notice.

codecs.replace_errors(exception)

   Implements the "'replace'" error handling.

   Substitutes "?" (ASCII character) for encoding errors or "�"
   (U+FFFD, the official REPLACEMENT CHARACTER) for decoding errors.

codecs.backslashreplace_errors(exception)

   Implements the "'backslashreplace'" error handling.

   Malformed data is replaced by a backslashed escape sequence. On
   encoding, use the hexadecimal form of Unicode code point with
   formats "\xhh" "\uxxxx" "\Uxxxxxxxx". On decoding, use the
   hexadecimal form of byte value with format "\xhh".

   バージョン 3.5 で変更: Works with decoding and translating.

codecs.xmlcharrefreplace_errors(exception)

   Implements the "'xmlcharrefreplace'" error handling (for encoding
   within *text encoding* only).

   The unencodable character is replaced by an appropriate XML/HTML
   numeric character reference, which is a decimal form of Unicode
   code point with format "&#num;" .

codecs.namereplace_errors(exception)

   Implements the "'namereplace'" error handling (for encoding within
   *text encoding* only).

   The unencodable character is replaced by a "\N{...}" escape
   sequence. The set of characters that appear in the braces is the
   Name property from Unicode Character Database. For example, the
   German lowercase letter "'ß'" will be converted to byte sequence
   "\N{LATIN SMALL LETTER SHARP S}" .

   バージョン 3.5 で追加.


ステートレスなエンコードとデコード
----------------------------------

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

Codec.encode(input, errors='strict')

   オブジェクト *input* エンコードし、(出力オブジェクト, 消費した長さ)
   のタプルを返します。例えば、 *テキストエンコーディング* は文字列オ
   ブジェクトを特有の文字セット (例えば "cp1252" や "iso-8859-1") を用
   いてバイト列オブジェクトに変換します。

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

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

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

Codec.decode(input, errors='strict')

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

   テキストエンコーディングとバイト列からバイト列への codec では、
   *input* は bytes オブジェクト、または読み出し専用のバッファインター
   フェースを提供するオブジェクトである必要があります。例えば、buffer
   オブジェクトやメモリマップドファイルでなければなりません。

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

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

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


インクリメンタルなエンコードとデコード
--------------------------------------

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

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


IncrementalEncoder オブジェクト
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

class codecs.IncrementalEncoder(errors='strict')

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

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

   "IncrementalEncoder" は、 *errors* キーワード引数を提供することで、
   様々なエラー取扱方法を実装することができます。取り得る値については
   エラーハンドラ を参照してください。

   *errors* 引数は、同名の属性に代入されます。この属性を変更すると、
   "IncrementalEncoder" オブジェクトが生きている間に、異なるエラー処理
   方法に切り替えることができるようになります。

   encode(object, final=False)

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

   reset()

      エンコーダを初期状態にリセットします。出力は破棄されます。
      ".encode(object, final=True)" を呼び出して、必要に応じて空バイト
      列またはテキスト文字列を渡すことにより、エンコーダをリセットし、
      出力を取得します。

   getstate()

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

   setstate(state)

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


IncrementalDecoder オブジェクト
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

class codecs.IncrementalDecoder(errors='strict')

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

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

   "IncrementalDecoder" は、 *errors* キーワード引数を提供することで、
   様々なエラー取扱方法を実装することができます。取り得る値については
   エラーハンドラ を参照してください。

   *errors* 引数は、同名の属性に代入されます。この属性を変更すると、
   "IncrementalDecoder" オブジェクトが生きている間に、異なるエラー処理
   方法に切り替えることができるようになります。

   decode(object, final=False)

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

   reset()

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

   getstate()

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

   setstate(state)

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


ストリームのエンコードとデコード
--------------------------------

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


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)

      Writes the concatenated iterable of strings to the stream
      (possibly by reusing the "write()" method). Infinite or very
      large iterables are not supported. The standard bytes-to-bytes
      codecs do not support this method.

   reset()

      内部状態保持に使われた codec のバッファをリセットします。

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

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


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=-1, chars=-1, firstline=False)

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

      *chars* 引数は、いくつのデコードされたコードポイントまたはバイト
      列を返すかを表します。 "read()" メソッドは、要求された数以上のデ
      ータを返すことはありませんが、データがそれより少ない場合には要求
      された数未満のデータを返す場合があります。

      *size* 引数は、デコード用に読み込むエンコードされたバイト列また
      はコードポイントの、およその最大バイト数を表します。デコーダはこ
      の値を適切な値に変更できます。デフォルト値 -1 の場合、可能な限り
      多くのデータを読み込みます。この引数の目的は、巨大なファイルの一
      括デコードを防ぐことにあります。

      *firstline* フラグは、1行目さえ返せばその後の行でデコードエラー
      があっても無視して十分だ、ということを示します。

      このメソッドは貪欲な読み込み戦略を取るべきです。すなわち、エンコ
      ーディング定義と size の値が許す範囲で、できるだけ多くのデータを
      読むべきだということです。たとえば、ストリーム上にエンコーディン
      グの終端や状態の目印があれば、それも読み込みます。

   readline(size=None, keepends=True)

      入力ストリームから1行読み込み、デコード済みのデータを返します。

      *size* が与えられた場合、ストリームの "read()" メソッドに size
      引数として渡されます。

      *keepends* が偽の場合には行末の改行が削除された行が返ります。

   readlines(sizehint=None, keepends=True)

      入力ストリームから全ての行を読み込み、行のリストとして返します。

      *keepends* が真なら、改行は、codec の "decode()" メソッドを使っ
      て実装され、リスト要素の中に含まれます。

      *sizehint* が与えられた場合、ストリームの "read()" メソッドに
      *size* 引数として渡されます。

   reset()

      内部状態保持に使われた codec のバッファをリセットします。

      ストリームの読み位置を再設定してはならないので注意してください。
      このメソッドはデコードの際にエラーから復帰できるようにするための
      ものです。

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


StreamReaderWriter オブジェクト
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"StreamReaderWriter" は、読み書き両方に使えるストリームをラップできる
便利なクラスです。

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

class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict')

   "StreamReaderWriter" インスタンスを生成します。 *stream* はファイル
   類似のオブジェクトです。 *Reader* と *Writer* は、それぞれ
   "StreamReader" と "StreamWriter" インターフェースを提供するファクト
   リ関数かファクトリクラスでなければなりません。エラー処理は、ストリ
   ームリーダとライタで定義したものと同じように行われます。

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


StreamRecoder オブジェクト
~~~~~~~~~~~~~~~~~~~~~~~~~~

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

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

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

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

   これらのオブジェクトを使って、たとえば、 Latin-1 から UTF-8 への変
   換、あるいは逆向きの変換を、透過的に行うことができます。

   *stream* 引数はファイルライクオブジェクトでなくてはなりません。

   *encode* 引数と *decode* 引数は "Codec" のインターフェースに忠実で
   なくてはなりません。*Reader* と *Writer* は、それぞれ
   "StreamReader" と "StreamWriter" のインターフェースを提供するオブジ
   ェクトのファクトリ関数かクラスでなくてはなりません。

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

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


エンコーディングと Unicode
==========================

Strings are stored internally as sequences of code points in range
"U+0000"--"U+10FFFF". (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*.

最も単純なテキストエンコーディング ("'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 文字のひとつの文字
列定数があり、どの文字がどのバイト値へ対応付けられるかが示されています
。

All of these encodings can only encode 256 of the 1114112 code points
defined in Unicode. A simple and straightforward way that can store
each Unicode code point, is to store each code point as four
consecutive bytes. There are two possibilities: store the bytes in big
endian or in little endian order. These two encodings are called
"UTF-32-BE" and "UTF-32-LE" respectively. Their disadvantage is that
if e.g. you use "UTF-32-BE" on a little endian machine you will always
have to swap bytes on encoding and decoding. "UTF-32" avoids this
problem: bytes will always be in natural endianness. When these bytes
are read by a CPU with a different endianness, then bytes have to be
swapped though. To be able to detect the endianness of a "UTF-16" or
"UTF-32" byte sequence, there's the so called BOM ("Byte Order Mark").
This is the Unicode character "U+FEFF". This character can be
prepended to every "UTF-16" or "UTF-32" byte sequence. The byte
swapped version of this character ("0xFFFE") is an illegal character
that may not appear in a Unicode text. So when the first character in
a "UTF-16" or "UTF-32" byte sequence appears to be a "U+FFFE" the
bytes have to be swapped on decoding. Unfortunately the character
"U+FEFF" had a second purpose as a "ZERO WIDTH NO-BREAK SPACE": a
character that has no width and doesn't allow a word to be split. It
can e.g. be used to give hints to a ligature algorithm. With Unicode
4.0 using "U+FEFF" as a "ZERO WIDTH NO-BREAK SPACE" has been
deprecated (with "U+2060" ("WORD JOINER") assuming this role).
Nevertheless Unicode software still must be able to handle "U+FEFF" in
both roles: as a BOM it's a device to determine the storage layout of
the encoded bytes, and vanishes once the byte sequence has been
decoded into a string; as a "ZERO WIDTH NO-BREAK SPACE" it's a normal
character that will be decoded like any other.

There's another encoding that is able to encode the full range of
Unicode characters: UTF-8. UTF-8 is an 8-bit encoding, which means
there are no issues with byte order in UTF-8. Each byte in a UTF-8
byte sequence consists of two parts: marker bits (the most significant
bits) and payload bits. The marker bits are a sequence of zero to four
"1" bits followed by a "0" bit. Unicode characters are encoded like
this (with x being payload bits, which when concatenated give the
Unicode character):

+-------------------------------------+------------------------------------------------+
| 範囲                                | エンコーディング                               |
|=====================================|================================================|
| "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" として扱われます。

Without external information it's impossible to reliably determine
which encoding was used for encoding a string. Each charmap encoding
can decode any random byte sequence. However that's not possible with
UTF-8, as UTF-8 byte sequences have a structure that doesn't allow
arbitrary byte sequences. To increase the reliability with which a
UTF-8 encoding can be detected, Microsoft invented a variant of UTF-8
(that Python calls ""utf-8-sig"") for its Notepad program: Before any
of the Unicode characters is written to the file, a UTF-8 encoded BOM
(which looks like this as a byte sequence: "0xef", "0xbb", "0xbf") is
written. As it's rather improbable that any charmap encoded file
starts with these byte values (which would e.g. map to

      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 の使用は推奨されておらず、一般的には避け
るべきです。


標準エンコーディング
====================

Python には数多くの codec が組み込みで付属します。これらは C 言語の関
数、対応付けを行うテーブルの両方で提供されています。以下のテーブルでは
codec と、いくつかの良く知られている別名と、エンコーディングが使われる
言語を列挙します。別名のリスト、言語のリストともしらみつぶしに網羅され
ているわけではありません。大文字と小文字、またはアンダースコアの代りに
ハイフンにしただけの綴りも有効な別名です; そのため、例えば "'utf-8'"
は "'utf_8'" codec の正当な別名です。

**CPython implementation detail:** いくつかの一般的なエンコーディング
は、パフォーマンスを改善するために codec の検索機構を回避することがあ
ります。 このような最適化の機会を認識するのは、 CPython の限定された (
大文字小文字を区別しない) 別名に対してのみです: utf-8, utf8, latin-1,
latin1, iso-8859-1, iso8859-1, mbcs (Windows のみ), ascii, us-ascii,
utf-16, utf16, utf-32, utf32 およびダッシュの代わりにアンダースコアを
用いたもの。 これらのエンコーディングの別のつづりを使用すると実行時間
の低下を招くかもしれません。

バージョン 3.6 で変更: us-ascii に対して最適化の機会が認識されるように
なりました。

多くの文字セットは同じ言語をサポートしています。これらの文字セットは個
々の文字 (例えば、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                     | ベトナム                         |
+-------------------+----------------------------------+----------------------------------+
| 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_centeuro                     |                                  |
+-------------------+----------------------------------+----------------------------------+
| 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, cp65001           | 全ての言語                       |
+-------------------+----------------------------------+----------------------------------+
| utf_8_sig         |                                  | 全ての言語                       |
+-------------------+----------------------------------+----------------------------------+

バージョン 3.4 で変更: utf-16* と utf-32* のエンコーダは、サロゲートコ
ードポイント ("U+D800"--"U+DFFF")  がエンコードされることを許可しなく
なりました。utf-32* デコーダは、サロゲートコードポイントに対応するバイ
ト列をデコードしなくなりました。

バージョン 3.8 で変更: "cp65001" is now an alias to "utf_8".


Python 特有のエンコーディング
=============================

予め定義された codec のいくつかは Python 特有のものなので、それらの
codec 名は Python の外では無意味なものとなります。以下に、想定されてい
る入出力のタイプに基づいて、それらを表にしました（テキストエンコーディ
ングは codec の最も一般的な使用例ですが、その根底にある codec 基盤は、
ただのテキストエンコーディングというよりも、任意のデータの変換をサポー
トしていることに注意してください）。非対称的な codec については、記載
された意味がエンコーディングの方向を説明しています。


テキストエンコーディング
------------------------

次の codec では、 Unicode におけるテキストエンコーディングと同様に、
"str" から "bytes" へのエンコードと、 *bytes-like object* から "str"
へのデコードを提供します。

+----------------------+-----------+-----------------------------+
| Codec                | 別名      | 意味                        |
|======================|===========|=============================|
| idna                 |           | **RFC 3490** の実装です。   |
|                      |           | "encodings.idna" も参照して |
|                      |           | ください。                  |
|                      |           | "errors='strict'" のみがサ  |
|                      |           | ポートされています。        |
+----------------------+-----------+-----------------------------+
| mbcs                 | ansi,     | Windows のみ: 被演算子を    |
|                      | dbcs      | ANSI コードページ (CP_ACP)  |
|                      |           | に従ってエンコード します。 |
+----------------------+-----------+-----------------------------+
| oem                  |           | Windows のみ: 被演算子を    |
|                      |           | OEM コードページ (CP_OEMCP) |
|                      |           | に従ってエンコー ドします。 |
|                      |           | バージョン 3.6 で追加.      |
+----------------------+-----------+-----------------------------+
| palmos               |           | PalmOS 3.5 のエンコーディン |
|                      |           | グです。                    |
+----------------------+-----------+-----------------------------+
| punycode             |           | **RFC 3492** の実装です。ス |
|                      |           | テートフル codecs は、サポ  |
|                      |           | ートされません。            |
+----------------------+-----------+-----------------------------+
| raw_unicode_escape   |           | 別のコードポイントに        |
|                      |           | "\uXXXX" と "\UXXXXXXXX" を |
|                      |           | 使用する Latin-1 エン コー  |
|                      |           | ディングです。既存のバック  |
|                      |           | スラッシュは、いかなる方法  |
|                      |           | でもエスケープ されません。 |
|                      |           | Python の pickle プロトコル |
|                      |           | で使用されます。            |
+----------------------+-----------+-----------------------------+
| undefined            |           | 空文字列を含む全ての変換に  |
|                      |           | 対して例外を送出します。エ  |
|                      |           | ラーハンドラは無視 されます |
|                      |           | 。                          |
+----------------------+-----------+-----------------------------+
| unicode_escape       |           | ASCII でエンコードされた    |
|                      |           | Python ソースコード内の、   |
|                      |           | Unicode リテラルに適 したエ |
|                      |           | ンコーディングです。ただし  |
|                      |           | 、引用符はエスケープされま  |
|                      |           | せん。 Latin-1 ソースコード |
|                      |           | からデコードします。実際に  |
|                      |           | は、Python のソースコー ド  |
|                      |           | はデフォルトでは UTF-8 を使 |
|                      |           | 用することに注意してくださ  |
|                      |           | い。                        |
+----------------------+-----------+-----------------------------+

バージョン 3.8 で変更: "unicode_internal" codec is removed.


バイナリ変換 (Binary Transforms)
--------------------------------

以下の codec は、*bytes-like object* から "bytes" マッピングへのバイナ
リ変換を提供します。"bytes.decode()" はこの変換をサポートしておらず、
"str"  を出力するだけです。

+------------------------+--------------------+--------------------------------+--------------------------------+
| Codec                  | 別名               | 意味                           | エンコーダ / デコーダ          |
|========================|====================|================================|================================|
| base64_codec [1]       | base64, base_64    | 被演算子をマルチラインの MIME  | "base64.encodebytes()" /       |
|                        |                    | base64 に変換します (結果は常  | "base64.decodebytes()"         |
|                        |                    | に末尾の "'\n'" を含みます)。  |                                |
|                        |                    | バージョン 3.4 で変更: 任意の  |                                |
|                        |                    | *bytes-like object* をエンコー |                                |
|                        |                    | ドとデコー ド用の入力として受  |                                |
|                        |                    | け取ります。                   |                                |
+------------------------+--------------------+--------------------------------+--------------------------------+
| bz2_codec              | bz2                | 被演算子をbz2を使って圧縮しま  | "bz2.compress()" /             |
|                        |                    | す。                           | "bz2.decompress()"             |
+------------------------+--------------------+--------------------------------+--------------------------------+
| hex_codec              | hex                | 被演算子をバイトあたり 2 桁の  | "binascii.b2a_hex()" /         |
|                        |                    | 16 進数の表現に変換します。    | "binascii.a2b_hex()"           |
+------------------------+--------------------+--------------------------------+--------------------------------+
| quopri_codec           | quopri,            | 被演算子を MIME quoted         | "quotetabs=True" を指定した    |
|                        | quotedprintable,   | printable 形式に変換します。   | "quopri.encode()" /            |
|                        | quoted_printable   |                                | "quopri.decode()"              |
+------------------------+--------------------+--------------------------------+--------------------------------+
| uu_codec               | uu                 | 被演算子を uuencode を用いて変 | "uu.encode()" / "uu.decode()"  |
|                        |                    | 換します。                     |                                |
+------------------------+--------------------+--------------------------------+--------------------------------+
| zlib_codec             | zip, zlib          | 被演算子を gzip を用いて圧縮し | "zlib.compress()" /            |
|                        |                    | ます。                         | "zlib.decompress()"            |
+------------------------+--------------------+--------------------------------+--------------------------------+

[1] *バイト様オブジェクト* に加えて、"'base64_codec'" も "str" の
    ASCII のみのインスタンスをデコード用に受け入れるようになりました

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

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


テキスト変換 (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 でエイリアスは復活しなかった。)


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

このモジュールでは **RFC 3490** (アプリケーションにおける国際化ドメイ
ン名、 IDNA: Internationalized Domain Names in Applications) および
**RFC 3492** (Nameprep: 国際化ドメイン名 (IDN) のための stringprep プ
ロファイル) を実装しています。このモジュールは "punycode" エンコーディ
ングおよび "stringprep" の上に構築されています。

If you need the IDNA 2008 standard from **RFC 5891** and **RFC 5895**,
use the third-party idna module.

これらの 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** で定義されている区切り文字に基づいてラベルに分解し、各ラベルを要
求通りに 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" は真です。

encodings.idna.ToASCII(label)

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

encodings.idna.ToUnicode(label)

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


"encodings.mbcs" --- Windows ANSI コードページ
==============================================

This module implements the ANSI codepage (CP_ACP).

利用可能な環境: Windows のみ。

バージョン 3.3 で変更: 任意のエラーハンドラのサポート。

バージョン 3.2 で変更: 3.2 以前は *errors* 引数は無視されました; エン
コードには常に "'replace'" が、デコードには "'ignore'" が使われました
。


"encodings.utf_8_sig" --- BOM 印付き UTF-8
==========================================

このモジュールは UTF-8 codec の変種を実装します。エンコーディング時は
、UTF-8 でエンコードしたバイト列の前に UTF-8 でエンコードした BOM を追
加します。これは内部状態を持つエンコーダで、この動作は (バイトストリー
ムの最初の書き込み時に) 一度だけ行なわれます。デコーディング時は、デー
タの最初に UTF-8 でエンコードされた BOM があれば、それをスキップします
。
