"codecs" --- codec レジストリと基底クラス
*****************************************

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

======================================================================

このモジュールは、標準的な Python codec (エンコーダとデコーダ) 用の基
底クラスを定義し、codec とエラー処理検索プロセスを管理する内部の
Python codec レジストリへのアクセスを提供します。多くの codec はテキス
トをバイトにエンコードする (そしてバイトをテキストにデコードする) *テ
キストエンコーディング* ですが、テキストをテキストに、またはバイトをバ
イトにエンコードする codec も提供されています。カスタムの codec は任意
の型間でエンコードとデコードを行えますが、一部のモジュール機能は *テキ
ストエンコーディング* か "bytes" へのエンコードのみに制限されています
。

このモジュールでは、任意の codec でエンコードやデコードを行うための、
以下の関数が定義されています。

codecs.encode(obj, encoding='utf-8', errors='strict')

   *encoding* に記載された codec を使用して *obj* をエンコードします。

   希望のエラー処理スキームを *errors* に設定することができます。デフ
   ォルトのエラーハンドラ (エラー処理関数) は "'strict'" です。これは
   エンコードエラーは "ValueError" (もしくは "UnicodeEncodeError" のよ
   うな、より codec に固有のサブクラス) を送出することを意味します。
   codec エラー処理についてのより詳しい情報は Codec 基底クラス を参照
   してください。

codecs.decode(obj, encoding='utf-8', errors='strict')

   *encoding* に記載された codec を使用して *obj* をデコードします。

   希望のエラー処理スキームを *errors* に設定することができます。デフ
   ォルトのエラーハンドラは "'strict'" です。これはデコードエラーは
   "ValueError" (もしくは "UnicodeDecodeError" のような、より codec に
   固有のサブクラス) を送出することを意味します。codec エラー処理につ
   いてのより詳しい情報は Codec 基底クラス を参照してください。

codecs.charmap_build(string)

   独自の 1 バイトエンコーディングでのエンコードに適したマッピングを返
   します。 デコード用のテーブルを表す最大 256 文字の "str" *string*
   を渡すと、コンパクトな内部マッピングオブジェクト "EncodingMap"、ま
   たは文字のコードポイントをバイト値に対応付ける "辞書" を返します。
   入力が不正な場合は "TypeError" を送出します。

各 codec についての詳細も、次のようにして直接調べることができます。

codecs.lookup(encoding, /)

   Python codec レジストリから codec 情報を探し、以下で定義するような
   "CodecInfo" オブジェクトを返します。

   まず *encoding* を正規化します。 ASCII の英字をすべて小文字に変換し
   、スペースをハイフンに置き換えます。 次に、レジストリのキャッシュで
   エンコーディングを検索します。 見つからなければ、登録された検索関数
   のリストを順に調べます。 "CodecInfo" オブジェクトが見つからない場合
   は "LookupError" を送出します。 見つかった場合は、その "CodecInfo"
   オブジェクトをキャッシュに保存して呼び出し元に返します。

   バージョン 3.9 で変更: ASCII の英字、数字、ピリオド以外の文字をすべ
   てアンダースコアに変換するようになりました。

   バージョン 3.15 で変更: アンダースコアへの変換を行わなくなりました
   。 スペースはハイフンに変換します。

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

   codec レジストリ内を検索する場合の、codec の詳細です。コントラクタ
   引数は、次の同名の属性に保存されます。

   name

      エンコーディングの名前です。

   encode
   decode

      ステートレスなエンコーディングとデコーディングの関数です。これら
      は、Codec インスタンスの "encode()" メソッドと "decode()" メソッ
      ドと同じインターフェースを持っている必要があります (see Codec の
      インターフェース を参照)。この関数またはメソッドは、ステートレス
      モードで動作することが想定されています。

   incrementalencoder
   incrementaldecoder

      インクリメンタル・エンコーダとデコーダのクラスまたはファクトリ関
      数です。これらは、基底クラスの "IncrementalEncoder" と
      "IncrementalDecoder" が定義するインターフェースをそれぞれ提供す
      る必要があります。インクリメンタルな codec は、ステート (内部状
      態) を保持することができます。

   streamwriter
   streamreader

      ストリームライターとリーダーのクラスまたはファクトリ関数です。こ
      れらは、基底クラスの  "StreamWriter" と "StreamReader" が定義す
      るインターフェースをそれぞれ提供する必要があります。ストリーム
      codec は、ステートを保持することができます。

さまざまな codec 構成要素へのアクセスを簡便化するために、このモジュー
ルは以下のような関数を提供しています。これらの関数は、 codec の検索に
"lookup()" を使います:

codecs.getencoder(encoding)

   与えられたエンコーディングに対する codec を検索し、エンコーダ関数を
   返します。

   エンコーディングが見つからなければ "LookupError" を送出します。

codecs.getdecoder(encoding)

   与えられたエンコーディングに対する codec を検索し、デコーダ関数を返
   します。

   エンコーディングが見つからなければ "LookupError" を送出します。

codecs.getincrementalencoder(encoding)

   与えられたエンコーディングに対する codec を検索し、インクリメンタル
   ・エンコーダクラスまたはファクトリ関数を返します。

   エンコーディングが見つからないか、 codec がインクリメンタル・エンコ
   ーダをサポートしなければ "LookupError" を送出します。

codecs.getincrementaldecoder(encoding)

   与えられたエンコーディングに対する codec を検索し、インクリメンタル
   ・デコーダクラスまたはファクトリ関数を返します。

   エンコーディングが見つからないか、 codec がインクリメンタル・デコー
   ダをサポートしなければ "LookupError" を送出します。

codecs.getreader(encoding)

   与えられたエンコーディングに対する codec を検索し、"StreamReader"
   クラスまたはファクトリ関数を返します。

   エンコーディングが見つからなければ "LookupError" を送出します。

codecs.getwriter(encoding)

   与えられたエンコーディングに対する codec を検索し、"StreamWriter"
   クラスまたはファクトリ関数を返します。

   エンコーディングが見つからなければ "LookupError" を送出します。

次のように、適切な codec 検索関数を登録することで、カスタムの codecs
を利用することができます。

codecs.register(search_function, /)

   codec 検索関数を登録します。 検索関数は引数を 1 つ受け取り、
   "CodecInfo" オブジェクトを返す必要があります。 引数は、小文字に変換
   され、スペースをハイフンに置き換えたエンコーディング名です。 指定さ
   れたエンコーディングが見つからない場合は "None" を返してください。

codecs.unregister(search_function, /)

   codec 検索関数の登録を解除し、レジストリのキャッシュを消去します。
   検索関数が登録されていなければ何もしません。

   Added in version 3.10.

エンコードされたテキストファイルを処理する場合、組み込みの "open()" と
それに関連付けられた "io" モジュールの使用が推奨されていますが、このモ
ジュールは追加のユーティリティ関数とクラスを提供し、バイナリファイルを
処理する場合に幅広い codecs を利用できるようにします。

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

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

   注釈:

     *encoding* が "None" でなければ、下層のエンコードされたファイルは
     、常にバイナリモードで開きます。読み書き時に、 "'\n'" の自動変換
     は行われません。*mode* 引数は、組み込みの "open()" 関数が受け入れ
     る任意のバイナリモードにすることができます。"'b'" が自動的に付加
     されます。

   *encoding* は、そのファイルに対して使用されるエンコーディングを指定
   します。バイトにエンコードする、あるいはバイトからデコードするすべ
   てのエンコーディングが許可されます。ファイルメソッドがサポートする
   データ型は、使用される codec によって異なります。

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

   *buffering* は組み込み関数 "open()" の引数と同じ意味です。 デフォル
   トは -1 で、デフォルトのバッファサイズを使うことを意味します。

   バージョン 3.11 で変更: "'U'" モードは削除されました。

   バージョン 3.14 で非推奨: "codecs.open()" は "open()" に置き換えら
   れました。

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

   透過的なエンコード変換を行うファイルのラップされたバージョンである
   、"StreamRecoder" インスタンスを返します。元のファイルは、ラップさ
   れたバージョンが閉じられる時に、閉じられます。

   ラップされたファイルに書き込まれたデータは、指定された
   *data_encoding* に従ってデコードされ、次に *file_encoding* を使用し
   て元のファイルにバイトとして書き出されます。元のファイルから読み出
   されたバイトは、*file_encoding* に従ってデコードされ、結果は
   *data_encoding* を使用してエンコードされます。

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

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

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

   インクリメンタル・エンコーダを使って、*iterator* から得られる入力を
   順にエンコードします。 *iterator* は "str" オブジェクトを yield す
   る必要があります。 この関数は *ジェネレーター* です。 *errors* 引数
   とその他のキーワード引数は、インクリメンタル・エンコーダにそのまま
   渡されます。

   この関数では、コーデックはエンコードするテキストの "str" オブジェク
   トを受け付ける必要があります。 従って、 "base64_codec" のようなバイ
   トからバイトへのエンコーダはサポートしていません。

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

   インクリメンタル・デコーダを使って、*iterator* から得られる入力を順
   にデコードします。 *iterator* は "bytes" オブジェクトを yield する
   必要があります。 この関数は *ジェネレーター* です。 *errors* 引数と
   その他のキーワード引数は、インクリメンタル・デコーダにそのまま渡さ
   れます。

   この関数では、コーデックはデコードする "bytes" オブジェクトを受け付
   ける必要があります。 従って、"rot_13" のようなテキストからテキスト
   へのエンコーダはサポートしませんが、 "rot_13" は "iterencode()" で
   同じように使えます。

codecs.readbuffer_encode(buffer, errors=None, /)

   バッファ互換のオブジェクト または "str" である *buffer* の生のバイ
   ト列と、そのバイト数を含む "tuple" を返します。 "str" は処理の前に
   UTF-8 でエンコードします。

   *errors* 引数は無視します。

      >>> codecs.readbuffer_encode(b"Zito")
      (b'Zito', 4)

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

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 がエンコードとデコードのエラーの処理方法
も定義する必要があります。


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

エラー処理の簡便化と標準化のため、コーデックは、*errors* 文字列引数を
指定した場合に別のエラー処理を行うような仕組みを実装してもかまいません
:

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

次のエラーハンドラは、Python のすべての 標準エンコーディング の codec
で使えます。

+---------------------------+-------------------------------------------------+
| 値                        | 意味                                            |
|===========================|=================================================|
| "'strict'"                | "UnicodeError" (または、そのサブクラス) を送出  |
|                           | します。これがデフォルト の動作です。           |
|                           | "strict_errors()" で実装されています。          |
+---------------------------+-------------------------------------------------+
| "'ignore'"                | 不正な形式のデータを無視し、何も通知することな  |
|                           | く処理を継続します。 "ignore_errors()" で実装さ |
|                           | れています。                                    |
+---------------------------+-------------------------------------------------+
| "'replace'"               | 代替の文字に置き換えます。 エンコード時は ASCII |
|                           | 文字の "?"、デコード時 は "�" (U+FFFD、正式名称 |
|                           | REPLACEMENT CHARACTER) を使います。             |
|                           | "replace_errors()" に実装されています。         |
+---------------------------+-------------------------------------------------+
| "'backslashreplace'"      | バックスラッシュによるエスケープシーケンスに置  |
|                           | き換えます。 エンコード 時は、Unicode コードポ  |
|                           | イントを "\x*hh*"、"\u*xxxx*"、"\U*xxxxxxxx*"   |
|                           | の 形式の 16 進表現にします。 デコード時は、バ  |
|                           | イト値を "\x*hh*" の形式の 16 進表現にします。  |
|                           | "backslashreplace_errors()" に実装されています  |
|                           | 。                                              |
+---------------------------+-------------------------------------------------+
| "'surrogateescape'"       | デコード時には、バイト列を "U+DC80" から        |
|                           | "U+DCFF" の範囲の個々のサロゲ ートコードで置き  |
|                           | 換えます。データのエンコード時に                |
|                           | "'surrogateescape'" エラーハンドラが使用される  |
|                           | と、このコードは同じバイト列に戻されます。 ( 詳 |
|                           | しくは **PEP 383** を参照。)                    |
+---------------------------+-------------------------------------------------+

次のエラーハンドラは、*テキストエンコーディング* のエンコード時にのみ
使えます。

+---------------------------+-------------------------------------------------+
| 値                        | 意味                                            |
|===========================|=================================================|
| "'xmlcharrefreplace'"     | Unicode コードポイントを "&#*num*;" の形式で 10 |
|                           | 進数で表した、XML/HTML の数値文字参照に置き換え |
|                           | ます。 "xmlcharrefreplace_errors()" に実装され  |
|                           | ています。                                      |
+---------------------------+-------------------------------------------------+
| "'namereplace'"           | "\N{...}" のエスケープシーケンスに置き換えます  |
|                           | 。 波括弧の中には Unicode 文字データベースの    |
|                           | Name プロパティを使います。                     |
|                           | "namereplace_errors()" に実装されています。     |
+---------------------------+-------------------------------------------------+

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

+---------------------+--------------------------+---------------------------------------------+
| 値                  | Codecs                   | 意味                                        |
|=====================|==========================|=============================================|
| "'surrogatepass'"   | utf-8, utf-16, utf-32,   | サロゲートコードポイント ("U+D800``～       |
|                     | utf-16-be, utf-16-le,    | ``U+DFFF") を通常のコードポイント としてエ  |
|                     | utf-32-be, utf-32-le     | ンコード・デコードできるようにします。 この |
|                     |                          | 指定がなければ、こ れらの codec は "str" に |
|                     |                          | サロゲートコードポイントが含まれているとエ  |
|                     |                          | ラー として扱います。                       |
+---------------------+--------------------------+---------------------------------------------+

Added in version 3.1: "'surrogateescape'" および "'surrogatepass'" エ
ラーハンドラ。

バージョン 3.4 で変更: "'surrogatepass'" エラーハンドラが utf-16* と
utf-32* の codec でも使えるようになりました。

Added in version 3.5: "'namereplace'" エラーハンドラです。

バージョン 3.5 で変更: "'backslashreplace'" エラーハンドラがデコードと
文字変換にも対応しました。

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

codecs.register_error(name, error_handler, /)

   エラーハンドラ *error_handler* を名前 *name* で登録します。エンコー
   ド中およびデコード中にエラーが送出された場合、*name* が errors 引数
   として指定されていれば *error_handler* が呼び出されます。

   *error_handler* はエラーの場所に関する情報の入った
   "UnicodeEncodeError" インスタンスとともに呼び出されます。エラー処理
   関数はこの例外を送出するか、別の例外を送出するか、入力のエンコード
   できなかった部分の代替文字列とエンコードを再開する場所が入ったタプ
   ルを返す必要があります。代替文字列は "str" または "bytes" のいずれ
   かにすることができます。代替文字列がバイト列である場合、エンコーダ
   は単に出力バッファにそれをコピーします。代替文字列が文字列である場
   合、エンコーダは代替文字列をエンコードします。元の入力中の指定位置
   からエンコードが再開されます。位置を負の値にすると、入力文字列の末
   端からの相対位置として扱われます。境界の外側にある位置を返した場合
   には "IndexError" が送出されます。

   デコードと文字変換も同様に動作しますが、ハンドラには
   "UnicodeDecodeError" または "UnicodeTranslateError" が渡されます。
   また、エラーハンドラが返す置換内容は、そのまま出力に入れられます。

登録済みのエラーハンドラ (標準エラーハンドラを含む) は、次のようにその
名前で検索することができます。

codecs.lookup_error(name, /)

   名前 *name* で登録済みのエラーハンドラを返します。

   エラーハンドラが見つからなければ "LookupError" を送出します。

以下の標準エラーハンドラも、モジュールレベルの関数として利用できます。

codecs.strict_errors(exception)

   "'strict'" エラー処理を実装します。

   エンコードまたはデコードのエラーごとに "UnicodeError" を送出します
   。

codecs.ignore_errors(exception)

   "'ignore'" エラー処理を実装します。

   不正な形式のデータを無視し、通知せずにエンコードまたはデコードを続
   けます。

codecs.replace_errors(exception)

   "'replace'" エラー処理を実装します。

   エンコードエラーでは ASCII 文字の "?"、デコードエラーでは "�"
   (U+FFFD、正式名称 REPLACEMENT CHARACTER) に置き換えます。

codecs.backslashreplace_errors(exception)

   "'backslashreplace'" エラー処理を実装します。

   不正な形式のデータを、バックスラッシュによるエスケープシーケンスに
   置き換えます。 エンコード時は、Unicode コードポイントを "\x*hh*"、
   "\u*xxxx*"、"\U*xxxxxxxx*" の形式の 16 進表現にします。 デコード時
   は、バイト値を "\x*hh*" の形式の 16 進表現にします。

   バージョン 3.5 で変更: デコードと文字変換にも対応しました。

codecs.xmlcharrefreplace_errors(exception)

   "'xmlcharrefreplace'" エラー処理を実装します (*テキストエンコーディ
   ング* のエンコード時のみ)。

   エンコードできない文字を、対応する XML/HTML の数値文字参照に置き換
   えます。 これは Unicode コードポイントを "&#*num*;" の形式で 10 進
   数で表したものです。

codecs.namereplace_errors(exception)

   "'namereplace'" エラー処理を実装します (*テキストエンコーディング*
   のエンコード時のみ)。

   エンコードできない文字を "\N{...}" のエスケープシーケンスに置き換え
   ます。 波括弧の中には Unicode 文字データベースの Name プロパティを
   使います。 例えば、ドイツ語の小文字 "'ß'" はバイト列 "\N{LATIN
   SMALL LETTER SHARP S}" に変換されます。

   Added in version 3.5.


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

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

class codecs.Codec

   encode(input, errors='strict')

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

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

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

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

   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)

      文字列のイテラブルの内容を連結してストリームに書き込みます
      ("write()" メソッドを再利用する場合もあります)。 無限のイテラブ
      ルや非常に大きいイテラブルはサポートしません。 標準のバイト列か
      らバイト列への codec では、このメソッドをサポートしません。

   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
==========================

文字列は内部的に "U+0000"--"U+10FFFF" の範囲のコードポイントのシーケン
スとして格納されます (実装に関する詳細については **PEP 393** を参照し
てください)。 文字列オブジェクトが CPU とメモリの外で使用されるように
なると、エンディアンやこれらの配列をバイト列として格納する方法が問題に
なります。 他のコーデックでも同様ですが、文字列オブジェクトをバイト列
に変換することは *エンコード* と呼ばれます。 また、バイト列から文字列
オブジェクトを再生成することは *デコード* と呼ばれます。 テキストをシ
リアライズするコーデックには多くの種類があります。 それらは、集合的に
*テキストエンコーディング* と呼ばれます。

最も単純なテキストエンコーディング ("'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, for example, you use "UTF-32-BE" on a little endian machine you
will always have to swap bytes on encoding and decoding. Python's
"UTF-16" and "UTF-32" codecs avoid this problem by using the
platform's native byte order when no BOM is present. Python follows
prevailing platform practice, so native-endian data round-trips
without redundant byte swapping, even though the Unicode Standard
defaults to big-endian when the byte order is unspecified. When these
bytes are read by a CPU with a different endianness, the bytes have to
be swapped. To be able to detect the endianness of a "UTF-16" or
"UTF-32" byte sequence, a BOM ("Byte Order Mark") is used. 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. When the first character of a "UTF-16" or "UTF-32" byte
sequence is "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.

さらにもう一つ 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 では ""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 の使用
は推奨されず、通常は避けてください。


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

Python には、C 関数やマッピングテーブルとしての辞書で実装された多数の
codec が組み込まれています。 次の表には、codec の名前、よく使われる別
名、そのエンコーディングが主に使われる言語を示します。 別名と言語のど
ちらも網羅的な一覧ではありません。 大文字・小文字だけが異なる名前や、
アンダースコアの代わりにスペースやハイフンを使った名前も、有効な別名で
す。 "normalize_encoding()" で正規化すると同じ名前になるためです。 例
えば "'utf-8'" は "'utf_8'" codec の有効な別名です。

注釈:

  次の表には、よく使われる別名を示します。 完全な一覧はソースファイル
  aliases.py を参照してください。

Windows では、すべてのコードページに対して "cpXXX" codec を利用できま
す。 ただし、他のプラットフォームでも存在が保証されるのは、次の表にあ
る codec だけです。

いくつかの一般的なエンコーディングは、パフォーマンスを改善するために
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            | ドイツ語  Added in version 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, IBM00858                    | 西ヨーロッパ言語                 |
+-------------------+----------------------------------+----------------------------------+
| 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,   | 日本語                           |
|                   | windows-31j                      |                                  |
+-------------------+----------------------------------+----------------------------------+
| cp949             | 949, ms949, uhc                  | 韓国語                           |
+-------------------+----------------------------------+----------------------------------+
| cp950             | 950, ms950                       | 繁体字中国語                     |
+-------------------+----------------------------------+----------------------------------+
| cp1006            |                                  | ウルドゥー語                     |
+-------------------+----------------------------------+----------------------------------+
| cp1026            | ibm1026                          | トルコ語                         |
+-------------------+----------------------------------+----------------------------------+
| cp1125            | 1125, ibm1125, cp866u, ruscii    | ウクライナ語  Added in version   |
|                   |                                  | 3.4.                             |
+-------------------+----------------------------------+----------------------------------+
| cp1140            | IBM01140                         | 西ヨーロッパ言語                 |
+-------------------+----------------------------------+----------------------------------+
| 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            |                                  | タジク語  Added in version 3.5.  |
+-------------------+----------------------------------+----------------------------------+
| koi8_u            |                                  | ウクライナ語                     |
+-------------------+----------------------------------+----------------------------------+
| kz1048            | kz_1048, strk1048_2002, rk1048   | カザフ語  Added in version 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         | utf8-sig                         | 全ての言語                       |
+-------------------+----------------------------------+----------------------------------+

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

バージョン 3.8 で変更: "cp65001" は "utf_8" の別名になりました。

バージョン 3.14 で変更: Windows では、すべてのコードページに対して
"cpXXX" codec を利用できるようになりました。


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

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


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

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

+----------------------+-----------+-----------------------------+
| Codec                | 別名      | 意味                        |
|======================|===========|=============================|
| idna                 |           | **RFC 3490** の実装です。   |
|                      |           | "encodings.idna" も参照して |
|                      |           | ください。                  |
|                      |           | "errors='strict'" のみがサ  |
|                      |           | ポートされています。  警告: |
|                      |           | この codec は "punycode" を |
|                      |           | 基にしています。 そのアルゴ |
|                      |           | リズムは入力が 長くなると処 |
|                      |           | 理効率が大きく低下するため  |
|                      |           | 、信頼できない入力の長さを  |
|                      |           | 制限 してください。         |
+----------------------+-----------+-----------------------------+
| mbcs                 | ansi,     | Windows のみ: 被演算子を    |
|                      | dbcs      | ANSI コードページ (CP_ACP)  |
|                      |           | に従ってエンコード します。 |
+----------------------+-----------+-----------------------------+
| oem                  |           | Windows のみ: 被演算子を    |
|                      |           | OEM コードページ (CP_OEMCP) |
|                      |           | に従ってエンコー ドします。 |
|                      |           | Added in version 3.6.       |
+----------------------+-----------+-----------------------------+
| palmos               |           | PalmOS 3.5 のエンコーディン |
|                      |           | グです。                    |
+----------------------+-----------+-----------------------------+
| punycode             |           | **RFC 3492** の実装です。ス |
|                      |           | テートフル codecs は、サポ  |
|                      |           | ートされません。  警告:     |
|                      |           | デコードとエンコードのアル  |
|                      |           | ゴリズムは、入力が長くなる  |
|                      |           | と処理効率が大き く低下する |
|                      |           | ため、信頼できない入力の長  |
|                      |           | さを制限してください。      |
+----------------------+-----------+-----------------------------+
| raw_unicode_escape   |           | Latin-1 エンコーディングを  |
|                      |           | 使い、その範囲外のコードポ  |
|                      |           | イントを "\u*XXXX*" と      |
|                      |           | "\U*XXXXXXXX*" で表します。 |
|                      |           | 既存のバックスラッシュはエ  |
|                      |           | ス ケープしません。 Python  |
|                      |           | の pickle プロトコルで使わ  |
|                      |           | れています。                |
+----------------------+-----------+-----------------------------+
| undefined            |           | この codec はテスト目的にの |
|                      |           | み使ってください。  空文字  |
|                      |           | 列を含む全ての変換に対して  |
|                      |           | 例外を送出します。エラーハ  |
|                      |           | ンドラは無視 されます。     |
+----------------------+-----------+-----------------------------+
| unicode_escape       |           | ASCII でエンコードされた    |
|                      |           | Python ソースコード内の、   |
|                      |           | Unicode リテラルに適 したエ |
|                      |           | ンコーディングです。ただし  |
|                      |           | 、引用符はエスケープされま  |
|                      |           | せん。 Latin-1 ソースコード |
|                      |           | からデコードします。実際に  |
|                      |           | は、Python のソースコー ド  |
|                      |           | はデフォルトでは UTF-8 を使 |
|                      |           | 用することに注意してくださ  |
|                      |           | い。                        |
+----------------------+-----------+-----------------------------+

バージョン 3.8 で変更: "unicode_internal" codec は削除されました。


バイナリ変換 (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 を用いて変 |                                |
|                        |                    | 換します。                     |                                |
+------------------------+--------------------+--------------------------------+--------------------------------+
| zlib_codec             | zip, zlib          | 被演算子を gzip を用いて圧縮し | "zlib.compress()" /            |
|                        |                    | ます。                         | "zlib.decompress()"            |
+------------------------+--------------------+--------------------------------+--------------------------------+

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

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

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


単独の codec 関数
-----------------

次の関数は codec と同様のエンコード・デコード機能を提供しますが、
"codecs.encode()" や "codecs.decode()" で名前を指定して使う codec とし
ては利用できません。 内部で (例えば "pickle" から) 使われており、
Python 3 で削除された "string_escape" codec と同様に動作します。

codecs.escape_encode(input, errors=None)

   エスケープシーケンスを使って *input* をエンコードします。 バイト列
   に対する "repr()" が、エスケープしたバイト値を生成するのと同様です
   。

   *input* は "bytes" オブジェクトでなければなりません。

   タプル "(output, length)" を返します。 *output* は "bytes" オブジェ
   クト、*length* は消費したバイト数です。

codecs.escape_decode(input, errors=None)

   *input* のエスケープシーケンスをデコードし、元のバイト列に戻します
   。

   *input* は *bytes-like object* でなければなりません。

   タプル "(output, length)" を返します。 *output* は "bytes" オブジェ
   クト、*length* は消費したバイト数です。


テキスト変換 (Text Transforms)
------------------------------

以下の codec は、"str" から "str" マッピングへのテキスト変換を提供しま
す。"str.encode()" はこの変換をサポートしておらず、 "bytes"  を出力す
るだけです。

+----------------------+-----------+-----------------------------+
| Codec                | 別名      | 意味                        |
|======================|===========|=============================|
| rot_13               | rot13     | 被演算子のシーザー暗号      |
|                      |           | (Caesar-cypher) を返します  |
|                      |           | 。                          |
+----------------------+-----------+-----------------------------+

Added in version 3.2: "rot_13" テキスト変換が復活しました。(訳注: 2.x
にはあったものが 3.0 で削除されていた。)

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


"encodings" --- エンコーディングパッケージ
==========================================

このモジュールは次の関数を実装しています。

encodings.normalize_encoding(encoding)

   エンコーディング名 *encoding* を正規化します。

   Normalization works as follows: all non-alphanumeric characters
   except the dot used for Python package names are collapsed and
   replaced with a single underscore, leading and trailing underscores
   are removed. For example, "'  -;#'" becomes "'_'".

   *encoding* には ASCII 文字だけを使ってください。

注釈:

  次の関数は、テスト目的を除いて直接使わないでください。 代わりに
  "codecs.lookup()" を使ってください。

encodings.search_function(encoding)

   指定したエンコーディング名 *encoding* に対応する codec モジュールを
   検索します。

   まず "normalize_encoding()" で *encoding* を正規化し、対応する別名
   を探します。 別名または正規化した名前を使い、encodings パッケージか
   ら codec モジュールのインポートを試みます。 モジュールが見つかり、
   "codecs.CodecInfo" オブジェクトを返す有効な "getregentry()" 関数が
   定義されていれば、codec をキャッシュして返します。

   codec モジュールに "getaliases()" 関数が定義されていれば、返された
   別名を今後使えるよう登録します。

encodings.win32_code_page_search_function(encoding)

   "cpXXXX" 形式の Windows コードページエンコーディング *encoding* を
   検索します。

   コードページが有効でサポートされていれば、その "codecs.CodecInfo"
   オブジェクトを返します。

   利用可能な環境: Windows.

   Added in version 3.14.

このモジュールは次の例外を実装しています。

exception encodings.CodecRegistryError

   codec が無効または非互換の場合に送出されます。


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

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

警告:

  このモジュールは "punycode" を基にしています。 そのアルゴリズムは入
  力が長くなると処理効率が大きく低下するため、信頼できない入力の長さを
  制限してください。

**RFC 5891** と **RFC 5895** の IDNA 2008 規格が必要な場合は、サードパ
ーティーの idna モジュールを使ってください。

これらの 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 関数を直
接使うこともできます。

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 コードページ
==============================================

このモジュールは ANSI コードページ (CP_ACP) を実装しています。

利用可能な環境: Windows.

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

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


"encodings.utf_8_sig" --- BOM シグネチャ付き UTF-8 codec
========================================================

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