7.2. codecs — Codec registry and base classes¶
Source code: Lib/codecs.py
This module defines base classes for standard Python codecs (encoders and
decoders) and provides access to the internal Python codec registry, which
manages the codec and error handling lookup process. Most standard codecs
are text encodings, which encode text to bytes,
but there are also codecs provided that encode text to text, and bytes to
bytes. Custom codecs may encode and decode between arbitrary types, but some
module features are restricted to use specifically with
text encodings, or with codecs that encode to
bytes.
The module defines the following functions for encoding and decoding with any codec:
-
codecs.encode(obj, encoding='utf-8', errors='strict')¶ Encodes obj using the codec registered for encoding.
Errors may be given to set the desired error handling scheme. The default error handler is
'strict'meaning that encoding errors raiseValueError(or a more codec specific subclass, such asUnicodeEncodeError). Refer to Codec Base Classes for more information on codec error handling.
-
codecs.decode(obj, encoding='utf-8', errors='strict')¶ Decodes obj using the codec registered for encoding.
Errors may be given to set the desired error handling scheme. The default error handler is
'strict'meaning that decoding errors raiseValueError(or a more codec specific subclass, such asUnicodeDecodeError). Refer to Codec Base Classes for more information on codec error handling.
The full details for each codec can also be looked up directly:
-
codecs.lookup(encoding)¶ Looks up the codec info in the Python codec registry and returns a
CodecInfoobject as defined below.Encodings are first looked up in the registry’s cache. If not found, the list of registered search functions is scanned. If no
CodecInfoobject is found, aLookupErroris raised. Otherwise, theCodecInfoobject is stored in the cache and returned to the caller.
-
class
codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)¶ Codec details when looking up the codec registry. The constructor arguments are stored in attributes of the same name:
-
name¶ The name of the encoding.
-
encode¶ -
decode¶ The stateless encoding and decoding functions. These must be functions or methods which have the same interface as the
encode()anddecode()methods of Codec instances (see Codec Interface). The functions or methods are expected to work in a stateless mode.
-
incrementalencoder¶ -
incrementaldecoder¶ Incremental encoder and decoder classes or factory functions. These have to provide the interface defined by the base classes
IncrementalEncoderandIncrementalDecoder, respectively. Incremental codecs can maintain state.
-
streamwriter¶ -
streamreader¶ Stream writer and reader classes or factory functions. These have to provide the interface defined by the base classes
StreamWriterandStreamReader, respectively. Stream codecs can maintain state.
-
To simplify access to the various codec components, the module provides
these additional functions which use lookup() for the codec lookup:
-
codecs.getencoder(encoding)¶ Look up the codec for the given encoding and return its encoder function.
Raises a
LookupErrorin case the encoding cannot be found.
-
codecs.getdecoder(encoding)¶ Look up the codec for the given encoding and return its decoder function.
Raises a
LookupErrorin case the encoding cannot be found.
-
codecs.getincrementalencoder(encoding)¶ Look up the codec for the given encoding and return its incremental encoder class or factory function.
Raises a
LookupErrorin case the encoding cannot be found or the codec doesn’t support an incremental encoder.
-
codecs.getincrementaldecoder(encoding)¶ Look up the codec for the given encoding and return its incremental decoder class or factory function.
Raises a
LookupErrorin case the encoding cannot be found or the codec doesn’t support an incremental decoder.
-
codecs.getreader(encoding)¶ Look up the codec for the given encoding and return its
StreamReaderclass or factory function.Raises a
LookupErrorin case the encoding cannot be found.
-
codecs.getwriter(encoding)¶ Look up the codec for the given encoding and return its
StreamWriterclass or factory function.Raises a
LookupErrorin case the encoding cannot be found.
Custom codecs are made available by registering a suitable codec search function:
-
codecs.register(search_function)¶ Register a codec search function. Search functions are expected to take one argument, being the encoding name in all lower case letters, and return a
CodecInfoobject. In case a search function cannot find a given encoding, it should returnNone.備註
Search function registration is not currently reversible, which may cause problems in some cases, such as unit testing or module reloading.
While the builtin open() and the associated io module are the
recommended approach for working with encoded text files, this module
provides additional utility functions and classes that allow the use of a
wider range of codecs when working with binary files:
-
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)¶ Open an encoded file using the given mode and return an instance of
StreamReaderWriter, providing transparent encoding/decoding. The default file mode is'r', meaning to open the file in read mode.備註
Underlying encoded files are always opened in binary mode. No automatic conversion of
'\n'is done on reading and writing. The mode argument may be any binary mode acceptable to the built-inopen()function; the'b'is automatically added.encoding specifies the encoding which is to be used for the file. Any encoding that encodes to and decodes from bytes is allowed, and the data types supported by the file methods depend on the codec used.
errors may be given to define the error handling. It defaults to
'strict'which causes aValueErrorto be raised in case an encoding error occurs.buffering has the same meaning as for the built-in
open()function. It defaults to line buffered.
-
codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')¶ Return a
StreamRecoderinstance, a wrapped version of file which provides transparent transcoding. The original file is closed when the wrapped version is closed.Data written to the wrapped file is decoded according to the given data_encoding and then written to the original file as bytes using file_encoding. Bytes read from the original file are decoded according to file_encoding, and the result is encoded using data_encoding.
If file_encoding is not given, it defaults to data_encoding.
errors may be given to define the error handling. It defaults to
'strict', which causesValueErrorto be raised in case an encoding error occurs.
-
codecs.iterencode(iterator, encoding, errors='strict', **kwargs)¶ Uses an incremental encoder to iteratively encode the input provided by iterator. This function is a generator. The errors argument (as well as any other keyword argument) is passed through to the incremental encoder.
This function requires that the codec accept text
strobjects to encode. Therefore it does not support bytes-to-bytes encoders such asbase64_codec.
-
codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)¶ Uses an incremental decoder to iteratively decode the input provided by iterator. This function is a generator. The errors argument (as well as any other keyword argument) is passed through to the incremental decoder.
This function requires that the codec accept
bytesobjects to decode. Therefore it does not support text-to-text encoders such asrot_13, althoughrot_13may be used equivalently withiterencode().
The module also provides the following constants which are useful for reading and writing to platform dependent files:
-
codecs.BOM¶ -
codecs.BOM_BE¶ -
codecs.BOM_LE¶ -
codecs.BOM_UTF8¶ -
codecs.BOM_UTF16¶ -
codecs.BOM_UTF16_BE¶ -
codecs.BOM_UTF16_LE¶ -
codecs.BOM_UTF32¶ -
codecs.BOM_UTF32_BE¶ -
codecs.BOM_UTF32_LE¶ These constants define various byte sequences, being Unicode byte order marks (BOMs) for several encodings. They are used in UTF-16 and UTF-32 data streams to indicate the byte order used, and in UTF-8 as a Unicode signature.
BOM_UTF16is eitherBOM_UTF16_BEorBOM_UTF16_LEdepending on the platform’s native byte order,BOMis an alias forBOM_UTF16,BOM_LEforBOM_UTF16_LEandBOM_BEforBOM_UTF16_BE. The others represent the BOM in UTF-8 and UTF-32 encodings.
7.2.1. Codec Base Classes¶
The codecs module defines a set of base classes which define the
interfaces for working with codec objects, and can also be used as the basis
for custom codec implementations.
Each codec has to define four interfaces to make it usable as codec in Python: stateless encoder, stateless decoder, stream reader and stream writer. The stream reader and writers typically reuse the stateless encoder/decoder to implement the file protocols. Codec authors also need to define how the codec will handle encoding and decoding errors.
7.2.1.1. Error Handlers¶
To simplify and standardize error handling, codecs may implement different error handling schemes by accepting the errors string argument. The following string values are defined and implemented by all standard Python codecs:
| Value | Meaning |
|---|---|
'strict' |
Raise UnicodeError (or a subclass);
this is the default. Implemented in
strict_errors(). |
'ignore' |
Ignore the malformed data and continue
without further notice. Implemented in
ignore_errors(). |
The following error handlers are only applicable to text encodings:
| Value | Meaning |
|---|---|
'replace' |
Replace with a suitable replacement
marker; Python will use the official
U+FFFD REPLACEMENT CHARACTER for the
built-in codecs on decoding, and 『?』 on
encoding. Implemented in
replace_errors(). |
'xmlcharrefreplace' |
Replace with the appropriate XML character
reference (only for encoding). Implemented
in xmlcharrefreplace_errors(). |
'backslashreplace' |
Replace with backslashed escape sequences.
Implemented in
backslashreplace_errors(). |
'namereplace' |
Replace with \N{...} escape sequences
(only for encoding). Implemented in
namereplace_errors(). |
'surrogateescape' |
On decoding, replace byte with individual
surrogate code ranging from U+DC80 to
U+DCFF. This code will then be turned
back into the same byte when the
'surrogateescape' error handler is used
when encoding the data. (See PEP 383 for
more.) |
In addition, the following error handler is specific to the given codecs:
| Value | Codecs | Meaning |
|---|---|---|
'surrogatepass' |
utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le | Allow encoding and decoding of surrogate codes. These codecs normally treat the presence of surrogates as an error. |
3.1 版新加入: The 'surrogateescape' and 'surrogatepass' error handlers.
