codecs —コーデックレジストリと基本クラス
ソースコード: :source: `Lib / codecs.py`
このモジュールは、標準のPythonコーデック(エンコーダーとデコーダー)の基本クラスを定義し、コーデックとエラー処理のルックアッププロセスを管理する内部Pythonコーデックレジストリへのアクセスを提供します。 ほとんどの標準コーデックはテキストエンコーディングで、テキストをバイトにエンコードしますが、テキストをテキストに、バイトをバイトにエンコードするコーデックも提供されています。 カスタムコーデックは任意のタイプ間でエンコードおよびデコードできますが、一部のモジュール機能は、テキストエンコーディングまたはバイトにエンコードするコーデックでの使用に制限されています。
このモジュールは、任意のコーデックでエンコードおよびデコードするための次の関数を定義します。
- codecs.encode(obj, encoding='utf-8', errors='strict')
encoding に登録されているコーデックを使用して obj をエンコードします。
エラーを指定して、目的のエラー処理スキームを設定できます。 デフォルトのエラーハンドラーは
'strict'
です。これは、エンコードエラーによって ValueError (または UnicodeEncodeError などのよりコーデック固有のサブクラス)が発生することを意味します。 コーデックエラー処理の詳細については、コーデック基本クラスを参照してください。
- codecs.decode(obj, encoding='utf-8', errors='strict')
encoding に登録されているコーデックを使用して obj をデコードします。
エラーを指定して、目的のエラー処理スキームを設定できます。 デフォルトのエラーハンドラは
'strict'
です。これは、デコードエラーによって ValueError (または UnicodeDecodeError などのよりコーデック固有のサブクラス)が発生することを意味します。 コーデックエラー処理の詳細については、コーデック基本クラスを参照してください。
各コーデックの完全な詳細は、直接検索することもできます。
- codecs.lookup(encoding)
Pythonコーデックレジストリでコーデック情報を検索し、以下に定義されているように CodecInfo オブジェクトを返します。
エンコーディングは、最初にレジストリのキャッシュで検索されます。 見つからない場合は、登録されている検索機能のリストがスキャンされます。 CodecInfo オブジェクトが見つからない場合、 LookupError が発生します。 それ以外の場合、 CodecInfo オブジェクトはキャッシュに格納され、呼び出し元に返されます。
- class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)
コーデックレジストリを検索するときのコーデックの詳細。 コンストラクター引数は、同じ名前の属性に格納されます。
- name
エンコーディングの名前。
- encode
decode ステートレスのエンコードおよびデコード機能。 これらは、コーデックインスタンスの encode()および decode()メソッドと同じインターフェイスを持つ関数またはメソッドである必要があります( Codecインターフェイスを参照)。 関数またはメソッドは、ステートレスモードで動作することが期待されています。
- incrementalencoder
incrementaldecoder インクリメンタルエンコーダおよびデコーダクラスまたはファクトリ関数。 これらは、基本クラス InitialEncoder および IncrementalDecoder によってそれぞれ定義されたインターフェースを提供する必要があります。 インクリメンタルコーデックは状態を維持できます。
- streamwriter
streamreader ストリームライターおよびリーダークラスまたはファクトリ関数。 これらは、基本クラス StreamWriter および StreamReader によってそれぞれ定義されたインターフェースを提供する必要があります。 ストリームコーデックは状態を維持できます。
さまざまなコーデックコンポーネントへのアクセスを簡素化するために、モジュールはコーデックルックアップに lookup()を使用する次の追加関数を提供します。
- codecs.getencoder(encoding)
指定されたエンコーディングのコーデックを検索し、そのエンコーダ関数を返します。
エンコーディングが見つからない場合、 LookupError を発生させます。
- codecs.getdecoder(encoding)
指定されたエンコーディングのコーデックを検索し、そのデコーダー関数を返します。
エンコーディングが見つからない場合、 LookupError を発生させます。
- codecs.getincrementalencoder(encoding)
指定されたエンコーディングのコーデックを検索し、そのインクリメンタルエンコーダクラスまたはファクトリ関数を返します。
エンコーディングが見つからない場合、またはコーデックがインクリメンタルエンコーダをサポートしていない場合に、 LookupError を発生させます。
- codecs.getincrementaldecoder(encoding)
指定されたエンコーディングのコーデックを検索し、そのインクリメンタルデコーダークラスまたはファクトリ関数を返します。
エンコーディングが見つからない場合、またはコーデックがインクリメンタルデコーダーをサポートしていない場合に、 LookupError を発生させます。
- codecs.getreader(encoding)
指定されたエンコーディングのコーデックを検索し、その StreamReader クラスまたはファクトリ関数を返します。
エンコーディングが見つからない場合、 LookupError を発生させます。
- codecs.getwriter(encoding)
指定されたエンコーディングのコーデックを検索し、その StreamWriter クラスまたはファクトリ関数を返します。
エンコーディングが見つからない場合、 LookupError を発生させます。
カスタムコーデックは、適切なコーデック検索機能を登録することで利用できるようになります。
- codecs.register(search_function)
コーデック検索機能を登録します。 検索関数は、すべて小文字のエンコード名である1つの引数を取り、 CodecInfo オブジェクトを返すことが期待されています。 検索関数が特定のエンコーディングを見つけられない場合は、
None
を返す必要があります。ノート
現在、検索機能の登録は元に戻せないため、ユニットテストやモジュールのリロードなどの問題が発生する可能性があります。
組み込みの open()および関連する io モジュールは、エンコードされたテキストファイルを操作するための推奨されるアプローチですが、このモジュールは、より広い範囲の使用を可能にする追加のユーティリティ関数とクラスを提供しますバイナリファイルを操作するときのコーデックの数:
- codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=- 1)
指定されたモードを使用してエンコードされたファイルを開き、 StreamReaderWriter のインスタンスを返し、透過的なエンコード/デコードを提供します。 デフォルトのファイルモードは
'r'
で、ファイルを読み取りモードで開くことを意味します。ノート
基になるエンコードされたファイルは、常にバイナリモードで開かれます。
'\n'
の自動変換は読み取りと書き込みでは行われません。 mode 引数は、組み込みの open()関数で受け入れ可能な任意のバイナリモードにすることができます。'b'
が自動的に追加されます。encoding は、ファイルに使用されるエンコーディングを指定します。 バイトにエンコードおよびバイトからデコードする任意のエンコードが許可され、ファイルメソッドでサポートされるデータ型は使用されるコーデックによって異なります。
エラーは、エラー処理を定義するために指定される場合があります。 デフォルトは
'strict'
で、エンコードエラーが発生した場合に ValueError が発生します。バッファリングは、組み込みの open()関数と同じ意味です。 デフォルトは-1です。これは、デフォルトのバッファサイズが使用されることを意味します。
- codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')
StreamRecoder インスタンスを返します。これは、透過的なトランスコーディングを提供する file のラップバージョンです。 ラップされたバージョンが閉じられると、元のファイルが閉じられます。
ラップされたファイルに書き込まれたデータは、指定された data_encoding に従ってデコードされ、 file_encoding を使用してバイトとして元のファイルに書き込まれます。 元のファイルから読み取られたバイトは、 file_encoding に従ってデコードされ、結果は data_encoding を使用してエンコードされます。
file_encoding が指定されていない場合、デフォルトで data_encoding になります。
エラーは、エラー処理を定義するために指定される場合があります。 デフォルトは
'strict'
で、エンコードエラーが発生した場合に ValueError が発生します。
- codecs.iterencode(iterator, encoding, errors='strict', **kwargs)
インクリメンタルエンコーダーを使用して、 iterator によって提供される入力を繰り返しエンコードします。 この関数はジェネレーターです。 errors 引数(およびその他のキーワード引数)は、インクリメンタルエンコーダに渡されます。
この関数では、コーデックがエンコードするテキスト str オブジェクトを受け入れる必要があります。 したがって、
base64_codec
などのバイトツーバイトエンコーダーはサポートされていません。
- codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)
インクリメンタルデコーダーを使用して、イテレーターによって提供される入力を繰り返しデコードします。 この関数はジェネレーターです。 errors 引数(およびその他のキーワード引数)は、インクリメンタルデコーダーに渡されます。
この関数では、コーデックがデコードする bytes オブジェクトを受け入れる必要があります。 したがって、
rot_13
は iterencode()と同等に使用できますが、rot_13
などのテキスト間エンコーダーはサポートしていません。
このモジュールは、プラットフォームに依存するファイルの読み取りと書き込みに役立つ次の定数も提供します。
- 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_UTF16_LE の場合は BOM_LE 、 BOM_UTF16_BE の場合は BOM_BE 。 その他は、UTF-8およびUTF-32エンコーディングのBOMを表します。
コーデック基本クラス
codecs モジュールは、コーデックオブジェクトを操作するためのインターフェイスを定義する一連の基本クラスを定義し、カスタムコーデック実装の基礎としても使用できます。
各コーデックは、Pythonでコーデックとして使用できるように、ステートレスエンコーダー、ステートレスデコーダー、ストリームリーダー、ストリームライターの4つのインターフェイスを定義する必要があります。 ストリームリーダーとライターは通常、ステートレスエンコーダー/デコーダーを再利用してファイルプロトコルを実装します。 コーデックの作成者は、コーデックがエンコードおよびデコードエラーを処理する方法も定義する必要があります。
エラーハンドラ
エラー処理を簡素化および標準化するために、コーデックは errors 文字列引数を受け入れることにより、さまざまなエラー処理スキームを実装する場合があります。 次の文字列値は、すべての標準Pythonコーデックによって定義および実装されています。
価値 | 意味 |
---|---|
'strict'
|
UnicodeError (またはサブクラス)を発生させます。 これがデフォルトです。 strict_errors()に実装されています。 |
'ignore'
|
不正な形式のデータを無視し、通知なしに続行します。 ignore_errors()に実装されています。 |
次のエラーハンドラは、テキストエンコーディングにのみ適用できます。
価値 | 意味 |
---|---|
'replace'
|
適切な交換用マーカーと交換してください。 Pythonは、デコード時の組み込みコーデックに公式のU+FFFD REPLACEMENT CHARACTERを使用し、「?」 エンコーディングについて。 replace_errors()に実装されています。
|
'xmlcharrefreplace'
|
適切なXML文字参照に置き換えます(エンコードのみ)。 xmlcharrefreplace_errors()に実装されています。 |
'backslashreplace'
|
バックスラッシュされたエスケープシーケンスに置き換えます。 backslashreplace_errors()に実装されています。 |
'namereplace'
|
\N{...} エスケープシーケンスに置き換えます(エンコードのみ)。 namereplace_errors()に実装されています。
|
'surrogateescape'
|
デコード時に、バイトをU+DC80 からU+DCFF の範囲の個々のサロゲートコードに置き換えます。 データのエンコード時に'surrogateescape' エラーハンドラーが使用されると、このコードは同じバイトに戻されます。 (詳細については、 PEP 383 を参照してください。)
|
さらに、次のエラーハンドラは、指定されたコーデックに固有です。
価値 | コーデック | 意味 |
---|---|---|
'surrogatepass'
|
utf-8、utf-16、utf-32、utf-16-be、utf-16-le、utf-32-be、utf-32-le | 代理コードのエンコードとデコードを許可します。 これらのコーデックは通常、サロゲートの存在をエラーとして扱います。 |
バージョン3.1の新機能: 'surrogateescape'
および'surrogatepass'
エラーハンドラー。
バージョン3.4で変更: 'surrogatepass'
エラーハンドラーがutf-16 *およびutf-32 *コーデックで機能するようになりました。
バージョン3.5の新機能: 'namereplace'
エラーハンドラー。
バージョン3.5で変更: 'backslashreplace'
エラーハンドラーがデコードと変換で機能するようになりました。
許可される値のセットは、新しい名前付きエラーハンドラーを登録することで拡張できます。
- codecs.register_error(name, error_handler)
エラー処理関数 error_handler を name という名前で登録してください。 name がerrorsパラメーターとして指定されている場合、エラーが発生した場合、エンコードおよびデコード中に error_handler 引数が呼び出されます。
エンコードの場合、 error_handler は、エラーの場所に関する情報を含む UnicodeEncodeError インスタンスで呼び出されます。 エラーハンドラは、この例外または別の例外を発生させるか、入力のエンコードできない部分とエンコードを続行する位置を置き換えたタプルを返す必要があります。 置換は、 str または bytes のいずれかです。 置換がバイトの場合、エンコーダーはそれらを出力バッファーにコピーするだけです。 置換が文字列の場合、エンコーダは置換をエンコードします。 エンコードは、指定された位置で元の入力から続行されます。 負の位置の値は、入力文字列の末尾を基準として扱われます。 結果の位置が範囲外の場合、 IndexError が発生します。
UnicodeDecodeError または UnicodeTranslateError がハンドラーに渡され、エラーハンドラーからの置換が直接出力に入れられることを除いて、デコードと変換は同様に機能します。
以前に登録されたエラーハンドラー(標準エラーハンドラーを含む)は、名前で検索できます。
- codecs.lookup_error(name)
以前に name という名前で登録されたエラーハンドラーを返します。
ハンドラーが見つからない場合に LookupError を発生させます。
次の標準エラーハンドラーもモジュールレベルの関数として使用できます。
- codecs.strict_errors(exception)
'strict'
エラー処理を実装します。エンコードまたはデコードエラーが発生するたびに、 UnicodeError が発生します。
- codecs.replace_errors(exception)
'replace'
エラー処理を実装します(テキストエンコーディングのみ):エンコーディングエラー(コーデックによってエンコードされる)の代わりに'?'
を使用し、'\ufffd'
(デコードエラー用のUnicode置換文字)。
- codecs.ignore_errors(exception)
'ignore'
エラー処理を実装します。不正な形式のデータは無視され、エンコードまたはデコードは通知なしに続行されます。
- codecs.xmlcharrefreplace_errors(exception)
'xmlcharrefreplace'
エラー処理を実装します(テキストエンコーディングでのエンコーディングのみ):エンコードできない文字は適切なXML文字参照に置き換えられます。
- codecs.backslashreplace_errors(exception)
'backslashreplace'
エラー処理を実装します(テキストエンコーディングの場合のみ):不正な形式のデータは、バックスラッシュされたエスケープシーケンスに置き換えられます。
- codecs.namereplace_errors(exception)
'namereplace'
エラー処理を実装します(テキストエンコーディングでのエンコーディングのみ):エンコードできない文字は\N{...}
エスケープシーケンスに置き換えられます。バージョン3.5の新機能。
ステートレスエンコーディングとデコーディング
基本Codec
クラスは、ステートレスエンコーダーとデコーダーの関数インターフェイスも定義するこれらのメソッドを定義します。
- Codec.encode(input[, errors])
オブジェクト input をエンコードし、タプル(出力オブジェクト、消費された長さ)を返します。 たとえば、テキストエンコーディングは、特定の文字セットエンコーディング(
cp1252
またはiso-8859-1
)を使用して文字列オブジェクトをバイトオブジェクトに変換します。errors 引数は、適用するエラー処理を定義します。 デフォルトは
'strict'
処理です。このメソッドは、
Codec
インスタンスに状態を格納しない場合があります。 エンコーディングを効率的にするために状態を維持する必要があるコーデックには、 StreamWriter を使用します。この状況では、エンコーダーは長さゼロの入力を処理し、出力オブジェクトタイプの空のオブジェクトを返すことができる必要があります。
- Codec.decode(input[, errors])
オブジェクト input をデコードし、タプル(出力オブジェクト、消費された長さ)を返します。 たとえば、テキストエンコーディングの場合、デコードは、特定の文字セットエンコーディングを使用してエンコードされたバイトオブジェクトを文字列オブジェクトに変換します。
テキストエンコーディングおよびバイトツーバイトコーデックの場合、 input は、バイトオブジェクト、または読み取り専用のバッファインターフェイスを提供するオブジェクト(たとえば、バッファオブジェクトやメモリマップトファイル)である必要があります。
errors 引数は、適用するエラー処理を定義します。 デフォルトは
'strict'
処理です。このメソッドは、
Codec
インスタンスに状態を格納しない場合があります。 デコードを効率的にするために状態を保持する必要があるコーデックには、 StreamReader を使用します。この状況では、デコーダーは長さゼロの入力を処理し、出力オブジェクトタイプの空のオブジェクトを返すことができる必要があります。
インクリメンタルエンコーディングとデコーディング
InitialEncoder クラスと IncrementalDecoder クラスは、インクリメンタルエンコーディングとデコーディングの基本的なインターフェイスを提供します。 入力のエンコード/デコードは、ステートレスエンコーダー/デコーダー関数の1回の呼び出しではなく、インクリメンタルエンコーダーの encode() / decode()メソッドの複数回の呼び出しで行われます。 /デコーダ。 インクリメンタルエンコーダー/デコーダーは、メソッド呼び出し中にエンコード/デコードプロセスを追跡します。
encode() / decode()メソッドへの呼び出しの結合された出力は、すべての単一入力が1つに結合された場合と同じであり、この入力はでエンコード/デコードされました。ステートレスエンコーダ/デコーダ。
IncrementalEncoderオブジェクト
IncrementalEncoder クラスは、複数のステップで入力をエンコードするために使用されます。 これは、Pythonコーデックレジストリと互換性を持たせるためにすべてのインクリメンタルエンコーダが定義する必要がある次のメソッドを定義します。
- class codecs.IncrementalEncoder(errors='strict')
IncrementalEncoder インスタンスのコンストラクター。
すべてのインクリメンタルエンコーダは、このコンストラクタインターフェイスを提供する必要があります。 キーワード引数は自由に追加できますが、Pythonコーデックレジストリで使用されるのはここで定義されているものだけです。
IncrementalEncoder は、 errors キーワード引数を提供することにより、さまざまなエラー処理スキームを実装できます。 可能な値については、エラーハンドラーを参照してください。
errors 引数は、同じ名前の属性に割り当てられます。 この属性を割り当てると、 IncrementalEncoder オブジェクトの存続期間中にさまざまなエラー処理戦略を切り替えることができます。
- encode(object[, final])
object をエンコードし(エンコーダーの現在の状態を考慮に入れて)、結果のエンコードされたオブジェクトを返します。 これが encode() final の最後の呼び出しである場合、trueである必要があります(デフォルトはfalseです)。
- reset()
エンコーダを初期状態にリセットします。 出力は破棄されます。
.encode(object, final=True)
を呼び出し、必要に応じて空のバイトまたはテキスト文字列を渡して、エンコーダをリセットし、出力を取得します。
- getstate()
エンコーダの現在の状態を返します。これは整数である必要があります。 実装では、
0
が最も一般的な状態であることを確認する必要があります。 (整数よりも複雑な状態は、状態をマーシャリング/ピクルス化し、結果の文字列のバイトを整数にエンコードすることで整数に変換できます。)
- setstate(state)
エンコーダの状態を状態に設定します。 state は、 getstate()によって返されるエンコーダー状態である必要があります。
IncrementalDecoderオブジェクト
IncrementalDecoder クラスは、複数のステップで入力をデコードするために使用されます。 これは、Pythonコーデックレジストリと互換性を持たせるためにすべてのインクリメンタルデコーダーが定義する必要がある次のメソッドを定義します。
- class codecs.IncrementalDecoder(errors='strict')
IncrementalDecoder インスタンスのコンストラクター。
すべてのインクリメンタルデコーダーは、このコンストラクターインターフェイスを提供する必要があります。 キーワード引数は自由に追加できますが、Pythonコーデックレジストリで使用されるのはここで定義されているものだけです。
IncrementalDecoder は、 errors キーワード引数を提供することにより、さまざまなエラー処理スキームを実装できます。 可能な値については、エラーハンドラーを参照してください。
errors 引数は、同じ名前の属性に割り当てられます。 この属性を割り当てると、 IncrementalDecoder オブジェクトの存続期間中にさまざまなエラー処理戦略を切り替えることができます。
- decode(object[, final])
オブジェクトをデコードし(デコーダーの現在の状態を考慮に入れて)、結果のデコードされたオブジェクトを返します。 これが decode() final の最後の呼び出しである場合、trueである必要があります(デフォルトはfalseです)。 final がtrueの場合、デコーダーは入力を完全にデコードし、すべてのバッファーをフラッシュする必要があります。 これが不可能な場合(例: 入力の最後のバイトシーケンスが不完全なため)ステートレスの場合と同じようにエラー処理を開始する必要があります(例外が発生する可能性があります)。
- reset()
デコーダーを初期状態にリセットします。
- getstate()
デコーダーの現在の状態を返します。 これは2つの項目を持つタプルである必要があり、最初の項目はまだデコードされていない入力を含むバッファーである必要があります。 2番目は整数である必要があり、追加の状態情報にすることができます。 (実装では、
0
が最も一般的な追加の状態情報であることを確認する必要があります。)この追加の状態情報が0
の場合、デコーダーを入力バッファーのない状態に設定できる必要があります。追加の状態情報として0
を使用します。これにより、以前にバッファリングされた入力をデコーダに供給すると、出力を生成せずに前の状態に戻ります。 (整数よりも複雑な追加の状態情報は、情報をマーシャリング/ピクルス化し、結果の文字列のバイトを整数にエンコードすることで整数に変換できます。)
- setstate(state)
デコーダーの状態を state に設定します。 state は、 getstate()によって返されるデコーダー状態である必要があります。
ストリームのエンコードとデコード
StreamWriter および StreamReader クラスは、新しいエンコーディングサブモジュールを非常に簡単に実装するために使用できる汎用の作業インターフェイスを提供します。 これがどのように行われるかの例については、encodings.utf_8
を参照してください。
StreamWriterオブジェクト
StreamWriter クラスはCodec
のサブクラスであり、Pythonコーデックレジストリと互換性を持たせるためにすべてのストリームライターが定義する必要がある次のメソッドを定義します。
- class codecs.StreamWriter(stream, errors='strict')
StreamWriter インスタンスのコンストラクター。
すべてのストリームライターは、このコンストラクターインターフェイスを提供する必要があります。 キーワード引数は自由に追加できますが、Pythonコーデックレジストリで使用されるのはここで定義されているものだけです。
stream 引数は、特定のコーデックに応じて、テキストまたはバイナリデータを書き込むために開いているファイルのようなオブジェクトである必要があります。
StreamWriter は、 errors キーワード引数を提供することにより、さまざまなエラー処理スキームを実装できます。 基盤となるストリームコーデックがサポートする可能性のある標準エラーハンドラーについては、エラーハンドラーを参照してください。
errors 引数は、同じ名前の属性に割り当てられます。 この属性を割り当てると、 StreamWriter オブジェクトの存続期間中にさまざまなエラー処理戦略を切り替えることができます。
- write(object)
エンコードされたオブジェクトのコンテンツをストリームに書き込みます。
- writelines(list)
文字列の連結リストをストリームに書き込みます(おそらく write()メソッドを再利用することによって)。 標準のバイトツーバイトコーデックは、この方法をサポートしていません。
- reset()
状態を維持するために使用されるコーデックバッファをフラッシュしてリセットします。
このメソッドを呼び出すと、出力のデータがクリーンな状態になり、状態を回復するためにストリーム全体を再スキャンしなくても、新しい新しいデータを追加できるようになります。
上記のメソッドに加えて、 StreamWriter は、基になるストリームから他のすべてのメソッドと属性も継承する必要があります。
StreamReaderオブジェクト
StreamReader クラスはCodec
のサブクラスであり、Pythonコーデックレジストリと互換性を持たせるためにすべてのストリームリーダーが定義する必要がある次のメソッドを定義します。
- class codecs.StreamReader(stream, errors='strict')
StreamReader インスタンスのコンストラクター。
すべてのストリームリーダーは、このコンストラクターインターフェイスを提供する必要があります。 キーワード引数は自由に追加できますが、Pythonコーデックレジストリで使用されるのはここで定義されているものだけです。
stream 引数は、特定のコーデックに応じて、テキストまたはバイナリデータを読み取るために開いているファイルのようなオブジェクトである必要があります。
StreamReader は、 errors キーワード引数を提供することにより、さまざまなエラー処理スキームを実装できます。 基盤となるストリームコーデックがサポートする可能性のある標準エラーハンドラーについては、エラーハンドラーを参照してください。
errors 引数は、同じ名前の属性に割り当てられます。 この属性を割り当てると、 StreamReader オブジェクトの存続期間中にさまざまなエラー処理戦略を切り替えることができます。
errors 引数に許可される値のセットは、 register_error()で拡張できます。
- read([size[, chars[, firstline]]])
ストリームからデータをデコードし、結果のオブジェクトを返します。
chars 引数は、返されるデコードされたコードポイントまたはバイトの数を示します。 read()メソッドは、要求されたよりも多くのデータを返すことはありませんが、十分な数がない場合は、返されるデータが少なくなる可能性があります。
size 引数は、デコードのために読み取るエンコードされたバイトまたはコードポイントのおおよその最大数を示します。 デコーダーは、この設定を必要に応じて変更できます。 デフォルト値-1は、可能な限り読み取りとデコードを行うことを示します。 このパラメーターは、巨大なファイルを1つのステップでデコードする必要がないようにすることを目的としています。
firstline フラグは、後の行でデコードエラーが発生した場合に、最初の行のみを返すだけで十分であることを示します。
このメソッドは、貪欲な読み取り戦略を使用する必要があります。つまり、エンコーディングの定義と指定されたサイズ内で許可されている限り多くのデータを読み取る必要があります。 オプションのエンコーディング終了または状態マーカーがストリームで使用可能な場合は、これらも読み取る必要があります。
- readline([size[, keepends]])
入力ストリームから1行を読み取り、デコードされたデータを返します。
size は、指定されている場合、サイズ引数としてストリームの read()メソッドに渡されます。
keepends がfalseの場合、返される行から行末が削除されます。
- readlines([sizehint[, keepends]])
入力ストリームで使用可能なすべての行を読み取り、それらを行のリストとして返します。
行末はコーデックの decode()メソッドを使用して実装され、 keepends がtrueの場合にリストエントリに含まれます。
sizehint は、指定されている場合、 size 引数としてストリームの read()メソッドに渡されます。
- reset()
状態を維持するために使用されるコーデックバッファをリセットします。
ストリームの再配置は行わないでください。 この方法は、主にデコードエラーから回復できるようにすることを目的としています。
上記のメソッドに加えて、 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
文字列は、0x0
– 0x10FFFF
の範囲のコードポイントのシーケンスとして内部的に格納されます。 (実装の詳細については、 PEP 393 を参照してください。)文字列オブジェクトがCPUとメモリの外部で使用されると、エンディアンとこれらの配列がバイトとして格納される方法が問題になります。 他のコーデックと同様に、文字列をバイトシーケンスにシリアル化することはエンコーディングと呼ばれ、バイトシーケンスから文字列を再作成することはデコードと呼ばれます。 テキストエンコーディングと呼ばれる集合体であるさまざまな異なるテキストシリアル化コーデックがあります。
最も単純なテキストエンコーディング('latin-1'
または'iso-8859-1'
と呼ばれる)は、コードポイント0〜255をバイト0x0
〜0xff
にマップします。これは、文字列オブジェクトを意味します。 U+00FF
より上のコードポイントを含むコードはこのコーデックでエンコードできません。 これを行うと、次のような UnicodeEncodeError が発生します(エラーメッセージの詳細は異なる場合があります):UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256)
。
すべてのUnicodeコードポイントの異なるサブセットを選択するエンコーディングの別のグループ(いわゆるcharmapエンコーディング)と、これらのコードポイントがバイト0x0
– 0xff
にマップされる方法があります。 これがどのように行われるかを確認するには、たとえば encodings/cp1252.py
(これは主にWindowsで使用されるエンコーディングです)。 どの文字がどのバイト値にマップされているかを示す256文字の文字列定数があります。
これらのエンコーディングはすべて、Unicodeで定義された1114112コードポイントのうち256個しかエンコードできません。 各Unicodeコードポイントを格納できる簡単で簡単な方法は、各コードポイントを4つの連続したバイトとして格納することです。 2つの可能性があります。バイトをビッグエンディアンまたはリトルエンディアンの順序で格納します。 これらの2つのエンコーディングは、それぞれUTF-32-BE
およびUTF-32-LE
と呼ばれます。 彼らの不利な点は、例えば リトルエンディアンのマシンでUTF-32-BE
を使用する場合は、エンコードとデコードで常にバイトを交換する必要があります。 UTF-32
は、この問題を回避します。バイトは常に自然なエンディアンになります。 ただし、これらのバイトが異なるエンディアンのCPUによって読み取られる場合は、バイトを交換する必要があります。 UTF-16
またはUTF-32
バイトシーケンスのエンディアンを検出できるようにするために、いわゆるBOM(「バイトオーダーマーク」)があります。 これはUnicode文字U+FEFF
です。 この文字は、すべてのUTF-16
またはUTF-32
バイトシーケンスの前に付けることができます。 この文字のバイトスワップバージョン(0xFFFE
)は、Unicodeテキストに表示されない可能性のある不正な文字です。 したがって、UTF-16
またはUTF-32
バイトシーケンスの最初の文字がU+FFFE
であるように見える場合は、デコード時にバイトを交換する必要があります。 残念ながら、文字U+FEFF
には、ZERO WIDTH NO-BREAK SPACE
としての2番目の目的がありました。幅がなく、単語を分割できない文字です。 それは例えばすることができます 合字アルゴリズムにヒントを与えるために使用されます。 U+FEFF
をZERO WIDTH NO-BREAK SPACE
として使用するUnicode4.0では、非推奨になりました(U+2060
(WORD JOINER
)がこの役割を引き受けます)。 それでも、Unicodeソフトウェアは両方の役割でU+FEFF
を処理できる必要があります。BOMとして、エンコードされたバイトのストレージレイアウトを決定するデバイスであり、バイトシーケンスが文字列にデコードされると消えます。 ZERO WIDTH NO-BREAK SPACE
として、他の文字と同じようにデコードされる通常の文字です。
Unicode文字の全範囲をエンコードできる別のエンコードがあります:UTF-8。 UTF-8は8ビットエンコーディングです。つまり、UTF-8のバイト順序に問題はありません。 UTF-8バイトシーケンスの各バイトは、マーカービット(最上位ビット)とペイロードビットの2つの部分で構成されます。 マーカービットは、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ではそれは不可能です。 UTF-8エンコーディングを検出できる信頼性を高めるために、Microsoftはメモ帳プログラム用にUTF-8のバリアント(Python2.5が"utf-8-sig"
を呼び出す)を発明しました。Unicode文字が書き込まれる前にファイルには、UTF-8でエンコードされたBOM(バイトシーケンスとして次のようになります:0xef
、0xbb
、0xbf
)が書き込まれます。 チャーマップでエンコードされたファイルがこれらのバイト値で始まる可能性はかなり低いため(たとえば、 にマップ
分音記号付きラテン語の小さな文字I
右向きのダブルアングル見積もりマーク
逆疑問符
iso-8859-1)では、これにより、utf-8-sig
エンコーディングがバイトシーケンスから正しく推測できる可能性が高くなります。 したがって、ここでは、BOMを使用して、バイトシーケンスの生成に使用されるバイト順序を決定することはできませんが、エンコーディングを推測するのに役立つ署名として使用されます。 utf-8-sigコーデックをエンコードすると、ファイルの最初の3バイトとして0xef
、0xbb
、0xbf
が書き込まれます。 デコード時に、utf-8-sig
は、ファイルの最初の3バイトとして表示される場合、それらの3バイトをスキップします。 UTF-8では、BOMの使用は推奨されておらず、通常は避ける必要があります。
標準エンコーディング
Pythonには、C関数として実装されているか、マッピングテーブルとして辞書が実装されている、多数のコーデックが組み込まれています。 次の表に、名前別のコーデック、いくつかの一般的なエイリアス、およびエンコーディングが使用される可能性のある言語を示します。 エイリアスのリストも言語のリストも網羅的であることを意図していません。 大文字と小文字のみが異なる、またはアンダースコアの代わりにハイフンを使用する代替スペルも有効なエイリアスであることに注意してください。 したがって、例えば 'utf-8'
は、'utf_8'
コーデックの有効なエイリアスです。
文字セットの多くは同じ言語をサポートしています。 それらは個々のキャラクターによって異なります(例: EURO SIGNがサポートされているかどうか)、およびコード位置への文字の割り当て。 特にヨーロッパ言語の場合、通常、次のバリアントが存在します。
- ISO8859コードセット
- Microsoft Windowsコードページ。通常は8859コードセットから派生しますが、制御文字を追加のグラフィック文字に置き換えます。
- IBMEBCDICコードページ
- ASCII互換のIBMPCコードページ
コーデック | エイリアス | 言語 |
---|---|---|
アスキー | 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 | ウルドゥー語 | |
cp1026 | ibm1026 | トルコ語 |
cp1125 | 1125、ibm1125、cp866u、ruscii |
ウクライナ語 バージョン3.4の新機能。
|
cp1140 | ibm1140 | 西ヨーロッパ |
cp1250 | Windows-1250 | 中央および東ヨーロッパ |
cp1251 | 窓-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、韓国語、ksc5601、ks_c-5601、ks_c-5601-1987、ksx1001、ks_x-1001 | 韓国語 |
gb2312 | 中国語、csiso58gb231280、euc-cn、euccn、eucgb2312-cn、gb2312-1980、gb2312-80、iso-ir-58 | 簡体字中国語 |
gbk | 936、cp936、ms936 | 統一された中国語 |
gb18030 | gb18030-2000 | 統一された中国語 |
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、キリル文字 | ブルガリア語、ベラルーシ語、マケドニア語、ロシア語、セルビア語 |
iso8859_6 | iso-8859-6、アラビア語 | アラビア語 |
iso8859_7 | iso-8859-7、ギリシャ語、ギリシャ語8 | ギリシャ語 |
iso8859_8 | iso-8859-8、ヘブライ語 | ヘブライ語 |
iso8859_9 | iso-8859-9、latin5、L5 | トルコ語 |
iso8859_10 | iso-8859-10、latin6、L6 | 北欧言語 |
iso8859_11 | iso-8859-11、タイ | タイ語 |
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 | 南東ヨーロッパ |
ジョハブ | cp1361、ms1361 | 韓国語 |
koi8_r | ロシア | |
koi8_t |
タジク語 バージョン3.5の新機能。
| |
koi8_u | ウクライナ語 | |
kz1048 | kz_1048、strk1048_2002、rk1048 |
カザフ バージョン3.5の新機能。
|
mac_cyrillic | maccyrillic | ブルガリア語、ベラルーシ語、マケドニア語、ロシア語、セルビア語 |
mac_greek | マックグリーク | ギリシャ語 |
mac_iceland | maciceland | アイスランド語 |
mac_latin2 | maclatin2、maccentraleurope | 中央および東ヨーロッパ |
mac_roman | マクロマン、マッキントッシュ | 西ヨーロッパ |
mac_turkish | macturkish | トルコ語 |
ptcp154 | csptcp154、pt154、cp154、キリル文字-アジア | カザフ |
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
はutf_8
のエイリアスになりました。
Python固有のエンコーディング
事前定義されたコーデックの多くはPythonに固有であるため、それらのコーデック名はPython以外では意味がありません。 これらは、予想される入力および出力タイプに基づいて以下の表にリストされています(テキストエンコーディングはコーデックの最も一般的なユースケースですが、基盤となるコーデックインフラストラクチャは、テキストエンコーディングだけでなく、任意のデータ変換をサポートします)。 非対称コーデックの場合、記載されている意味はエンコードの方向を表します。
テキストエンコーディング
次のコーデックは、Unicodeテキストエンコーディングと同様に、 str から bytes エンコーディングおよび bytesのようなオブジェクトから str デコーディングを提供します。
コーデック | エイリアス | 意味 |
---|---|---|
idna | RFC 3490 を実装します。 encodings.idna も参照してください。 errors='strict' のみがサポートされています。
| |
mbcs | ansi、dbcs | Windowsのみ:ANSIコードページ(CP_ACP)に従ってオペランドをエンコードします。 |
OEM |
Windowsのみ:OEMコードページ(CP_OEMCP)に従ってオペランドをエンコードします。 バージョン3.6の新機能。
| |
パルモス | PalmOS3.5のエンコーディング。 | |
punycode | RFC 3492 を実装します。 ステートフルコーデックはサポートされていません。 | |
raw_unicode_escape | 他のコードポイントには\uXXXX および\UXXXXXXXX を使用したLatin-1エンコーディング。 既存の円記号は決してエスケープされません。 Pythonのpickleプロトコルで使用されます。
| |
未定義 | 空の文字列も含め、すべての変換に対して例外を発生させます。 エラーハンドラは無視されます。 | |
unicode_escape | 引用符がエスケープされないことを除いて、ASCIIでエンコードされたPythonソースコードのUnicodeリテラルの内容として適したエンコード。 Latin-1ソースコードからデコードします。 Pythonソースコードは実際にはデフォルトでUTF-8を使用することに注意してください。 |
バージョン3.8で変更:「unicode_internal」コーデックが削除されました。
バイナリ変換
次のコーデックはバイナリ変換を提供します:バイトのようなオブジェクトからバイトへのマッピング。 bytes.decode()( str 出力のみを生成する)ではサポートされていません。
コーデック | エイリアス | 意味 | エンコーダー/デコーダー |
---|---|---|---|
base64_codec 1 | base64、base_64 |
オペランドを複数行のMIMEbase64に変換します(結果には常に末尾の バージョン3.4で変更:はバイトのようなオブジェクトをエンコードおよびデコードの入力として受け入れます
|
base64.encodebytes() / base64.decodebytes() |
bz2_codec | bz2 | bz2を使用してオペランドを圧縮します。 | bz2.compress() / bz2.decompress() |
hex_codec | ヘックス | オペランドを1バイトあたり2桁の16進表現に変換します。 | binascii.b2a_hex() / binascii.a2b_hex() |
quopri_codec | quopri、quotedprintable、quoted_printable | オペランドをMIMEquotedprintableに変換します。 | quopri.encode()とquotetabs=True / 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の新機能:バイナリ変換の復元。
バージョン3.4で変更:バイナリ変換のエイリアスの復元。
テキスト変換
次のコーデックはテキスト変換を提供します: str から str へのマッピング。 str.encode()( bytes 出力のみを生成する)ではサポートされていません。
コーデック | エイリアス | 意味 |
---|---|---|
rot_13 | rot13 | オペランドのシーザー暗号暗号化を返します。 |
バージョン3.2の新機能: rot_13
テキスト変換の復元。
バージョン3.4で変更: rot13
エイリアスの復元。
encodings.idna —アプリケーションの国際化ドメイン名
このモジュールは、 RFC 3490 (アプリケーションの国際化ドメイン名)および RFC 3492 (Nameprep:国際化ドメイン名のStringprepプロファイル( IDN))。 punycode
エンコーディングと stringprep に基づいて構築されています。
からのIDNA2008標準が必要な場合 RFC 5891 と RFC 5895 、サードパーティを使用します idnaモジュール _ 。
これらのRFCは一緒に、ドメイン名で非ASCII文字をサポートするプロトコルを定義します。 非ASCII文字(www.Alliancefrançaise.nu
など)を含むドメイン名は、ASCII互換のエンコーディング(www.xn--alliancefranaise-npb.nu
などのACE)に変換されます。 ドメイン名のACE形式は、DNSクエリ、HTTP Host フィールドなど、プロトコルで任意の文字が許可されていないすべての場所で使用されます。 この変換はアプリケーションで実行されます。 可能であれば、ユーザーには見えない:アプリケーションは、Unicodeドメインラベルをネットワーク上で透過的にIDNAに変換し、ACEラベルをUnicodeに変換してから、ユーザーに提示する必要があります。
Pythonは、いくつかの方法でこの変換をサポートしています。idna
コーデックは、UnicodeとACEの間の変換を実行し、RFC3490の セクション3.1で定義されている区切り文字に基づいて入力文字列をラベルに分離します。 および必要に応じて各ラベルをACEに変換し、逆に.
区切り文字に基づいて入力バイト文字列をラベルに分離し、見つかったACEラベルをUnicodeに変換します。 さらに、 socket モジュールはUnicodeホスト名をACEに透過的に変換するため、アプリケーションはホスト名をソケットモジュールに渡すときにホスト名自体を変換する必要はありません。 さらに、 http.client や ftplib など、関数パラメーターとしてホスト名を持つモジュールは、Unicodeホスト名( http.client )を受け入れます。 Host フィールドを送信する場合は、そのフィールドでIDNAホスト名を透過的に送信します。
ワイヤーからホスト名を受信する場合(逆の名前検索など)、Unicodeへの自動変換は実行されません。そのようなホスト名をユーザーに提示したいアプリケーションは、それらをUnicodeにデコードする必要があります。
モジュール encodings.idna は、ホスト名に対して特定の正規化を実行し、国際ドメイン名の大文字と小文字を区別せず、類似した文字を統合するnameprepプロシージャも実装します。 nameprep関数は、必要に応じて直接使用できます。
- encodings.idna.nameprep(label)
- ラベルの名前が準備されたバージョンを返します。 実装は現在クエリ文字列を想定しているため、
AllowUnassigned
はtrueです。
- encodings.idna.ToASCII(label)
- RFC 3490 で指定されているように、ラベルをASCIIに変換します。
UseSTD3ASCIIRules
はfalseと見なされます。
- encodings.idna.ToUnicode(label)
- RFC 3490 で指定されているように、ラベルをUnicodeに変換します。
encodings.mbcs — WindowsANSIコードページ
このモジュールは、ANSIコードページ(CP_ACP)を実装します。
バージョン3.3で変更:すべてのエラーハンドラーをサポートします。
バージョン3.2で変更: 3.2より前は、エラー引数は無視されていました。 'replace'
は常にエンコードに使用され、'ignore'
はデコードに使用されました。
encodings.utf_8_sig —BOM署名付きのUTF-8コーデック
このモジュールは、UTF-8コーデックのバリアントを実装します。 エンコード時に、UTF-8でエンコードされたBOMがUTF-8でエンコードされたバイトの前に付加されます。 ステートフルエンコーダの場合、これは1回だけ実行されます(バイトストリームへの最初の書き込み時)。 デコード時に、データの開始時にオプションのUTF-8エンコードされたBOMがスキップされます。