7.2. codecs - 编解码器注册表和基类

源代码: Lib / codecs.py

该模块为标准Python编解码器(编码器和解码器)定义基类,并提供对内部Python编解码器注册表的访问,该注册表管理编解码器和错误处理查找过程。大多数标准编解码器是text encodings,它将文本编码为字节,但也提供编码文本到文本,字节到字节。自定义编解码器可以在任意类型之间进行编码和解码,但某些模块功能仅限于使用text encodings,或编码为bytes的编解码器。

模块定义以下用于使用任何编解码器进行编码和解码的功能:

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

使用注册名为encoding的编解码器编码obj

错误可能会给以设置所需的错误处理方案。默认错误处理程序为'strict',意味着编码错误引发ValueError(或更多编解码器特定的子类,例如UnicodeEncodeError)。有关编解码器错误处理的详细信息,请参阅Codec Base Classes

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

使用注册名为encoding的解码器解码obj

错误可能会给以设置所需的错误处理方案。默认错误处理程序为'strict',意味着解码错误引发ValueError(或更多编解码器特定子类,例如UnicodeDecodeError)。有关编解码器错误处理的详细信息,请参阅Codec Base Classes

每个编解码器的完整详细信息也可以直接查找:

codecs.lookup(encoding)

在Python编解码器注册表中查找编解码器信息,并返回如下定义的CodecInfo对象。

编码首先在注册表的缓存中查找。如果未找到,扫描该列表注册的搜索功能。如果没有找到CodecInfo对象,则会引发LookupError否则,CodecInfo对象存储在缓存中并返回给调用者。

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

查找编解码器注册表时的编解码器详细信息。构造函数参数存储在同名的属性中:

名称

编码的名称。

encode
解码

无状态编码和解码功能。这些必须是与Codec实例的encode()decode()方法具有相同接口的函数或方法(请参阅Codec Interface) 。这些函数或方法应以无状态模式工作。

incrementalencoder
incrementaldecoder

增量编码器和解码器类或工厂功能。这些必须分别提供由基类IncrementalEncoderIncrementalDecoder定义的接口。增量编码解码器能保持状态。

streamwriter
streamreader

流写入器和读取器类或工厂函数。这些必须分别提供由基类StreamWriterStreamReader定义的接口。流的编解码器能保持状态。

为了简化对各种编解码器组件的访问,模块提供了使用lookup()进行编解码器查找的附加功能:

codecs.getencoder(encoding)

查找给定编码的编解码器,并返回其编码器函数。

引发a LookupError,以防无法找到编码。

codecs.getdecoder(encoding)

查找给定编码解码器并返回它的解码器的功能。

引发a LookupError,以防无法找到编码。

codecs.getincrementalencoder(encoding)

查找给定编码的编解码器,并返回其增量编码器类或工厂函数。

引发a LookupError,以防无法找到编码或编解码器不支持增量编码器。

codecs.getincrementaldecoder(encoding)

查找给定编码的编解码器,并返回其增量的解码器类或工厂函数。

引发a LookupError,以防无法找到编码或编解码器不支持增量解码器。

codecs.getreader(encoding)

查找给定编码的编解码器,并返回其StreamReader类或工厂函数。

引发a LookupError,以防无法找到编码。

codecs.getwriter(encoding)

查找给定编码的编解码器并返回其StreamWriter类或工厂函数。

引发a LookupError,以防无法找到编码。

通过注册合适的编解码器搜索功能,可以使用自定义编解码器:

codecs.register(search_function)

注册编码解码器查找函数。搜索函数需要一个参数,即所有小写字母的编码名称,并返回一个CodecInfo对象。如果搜索功能找不到给定的编码,则应返回None

搜索功能注册当前不可逆,这在某些情况下可能会导致问题,例如单元测试或模块重新加载。

虽然内置open()和相关的io模块是处理编码文本文件的推荐方法,但此模块提供了其他实用程序函数和类,允许使用更广泛的编解码器使用二进制文件时:

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

使用给定的模式打开编码文件,并返回实例StreamReaderWriter,提供透明编码/解码。默认文件模式为'r',表示以读取模式打开文件。

底层编码文件始终以二进制模式打开。在读取和写入时不进行自动转换'\n'mode参数可以是内建open()函数可接受的任何二进制模式;将自动添加'b'

编码指定要用于该文件的编码。允许对字节进行编码和解码的任何编码,文件方法支持的数据类型取决于所使用的编解码器。

错误可能会给出了定义的错误处理。它默认为'strict',这会导致在发生编码错误的情况下引发ValueError

buffers与内建open()函数含义相同。默认的缓冲线。

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

返回StreamRecoder实例,一个包装版本的文件,可提供透明转码。关闭封装版本时,将关闭原始文件。

根据给定的data_encoding对写入包装文件的数据进行解码,然后使用file_encoding t>>作为字节写入原始文件。根据file_encoding对从原始文件读取的字节进行解码,并使用data_encoding对结果进行编码。

如果未指定file_encoding,则默认为data_encoding

错误可能会给出了定义的错误处理。它默认为'strict',这会导致在发生编码错误的情况下引发ValueError

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

使用增量编码器对由迭代器提供的输入进行迭代编码。此函数是generatorerrors参数(以及任何其他关键字参数)传递到增量编码器。

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

使用增量解码器对由迭代器提供的输入进行迭代解码。此函数是generatorerrors参数(以及任何其他关键字参数)传递到增量解码器。

本模块还提供下列常量的读取和写入平台依赖文件非常有用:

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 is either BOM_UTF16_BE or BOM_UTF16_LE depending on the platform’s native byte order, BOM is an alias for BOM_UTF16, BOM_LE for BOM_UTF16_LE and BOM_BE for BOM_UTF16_BE. 其他代表的物料清单中 UTF 8 以及 utf-32 编码。

7.2.1.编解码器基类

codecs模块定义了一组基类,它们定义了使用编解码器对象的接口,也可以用作自定义编解码器实现的基础。

每个编解码器已定义四个接口,以使它可用作编解码器在 Python 中: 无国籍的编码器,无国籍的解码器、 流读取器和流编写器。流读取器和作家通常会重用无国籍的编码器/解码器来实现文件的协议。编解码器作者还需要定义编解码器将如何处理编码和解码错误。

7.2.1.1.错误处理程序

为了简化和标准化错误处理,编解码器可以通过接受错误字符串参数来实现不同的错误处理方案。以下字符串值是定义和实现的所有标准的 Python 编码解码器:

含义
'strict'引发UnicodeError(或子类);这是默认值。strict_errors()中实现。
'ignore'忽略格式错误的数据,并继续操作,无需另行通知。ignore_errors()中实现。

以下错误处理程序仅适用于text encodings

含义
'replace'更换合适的替换标记; Python将使用官方U+FFFD REPLACEMENT CHARACTER作为内建编解码器的解码,以及'?'对编码。replace_errors()中实现。
'xmlcharrefreplace'Replace with the appropriate XML character reference (only for encoding).xmlcharrefreplace_errors()中实现。
'backslashreplace'Replace with backslashed escape sequences.backslashreplace_errors()中实现。
'namereplace'替换为\N{...}转义序列(仅用于编码)。namereplace_errors()中实现。
'surrogateescape'在解码时,将字节替换为范围从U+DC80U+DCFF的各个代理码。当在编码数据时使用'surrogateescape'错误处理程序时,此代码将转回到同一字节。(更多信息,请参见 PEP 383)。

此外,以下错误处理程序特定于给定的编解码器:

编解码器含义
'surrogatepass'utf-8,utf-16,utf-32,utf-16-be,utf-16-le,utf-32-be,utf-允许代理代码的编码和解码。这些编解码器通常将代理的存在视为错误。

版本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指定为errors参数,则在编码和解码期间将调用error_handler参数。

对于编码,将使用UnicodeEncodeError实例调用error_handler,其中包含有关错误位置的信息。错误处理程序必须引用这个或不同的异常,或返回一个替换为输入的不可编辑部分的元组和编码应该继续的位置。替换可以是strbytes如果替换是字节,则编码器将它们简单地复制到输出缓冲器中。如果替换是字符串,则编码器将对替换进行编码。在指定位置的原始输入上继续编码。负位置值将被视为相对于输入字符串的结尾。如果结果位置超出边界,则会引发IndexError

除了UnicodeDecodeErrorUnicodeTranslateError之外,解码和转换的工作方式类似,将传递给处理程序,并将错误处理程序中的替换直接放入输出。

以前注册的错误处理程序(包括标准错误处理程序)可以按名称查找:

codecs.lookup_error(name)

返回根据名称名称以前注册的错误处理程序。

引发a LookupError,以防无法找到处理程序。

以下标准错误处理程序也可用作模块级函数:

codecs.strict_errors(exception)

实现'strict'错误处理:每个编码或解码错误引发UnicodeError

codecs.replace_errors(exception)

实现'replace'错误处理(仅适用于text encodings):替换'?'用于编码错误(由编解码器编码)和'\ufffd'(Unicode替换字符)用于解码错误。

codecs.ignore_errors(exception)

实现'ignore'错误处理:忽略格式错误的数据,继续编码或解码,无需另行通知。

codecs.xmlcharrefreplace_errors(exception)

实现'xmlcharrefreplace'错误处理(仅对text encodings进行编码):不可编码的字符由适当的XML字符引用替换。

codecs.backslashreplace_errors(exception)

实现'backslashreplace'错误处理(仅适用于text encodings):格式错误的数据由反斜杠转义序列替换。

codecs.namereplace_errors(exception)

实现'namereplace'错误处理(仅对text encodings进行编码):不可编码字符替换为\N{...}

版本3.5中的新功能。

7.2.1.2.无状态编码和解码

基础Codec类定义了这些方法,它们还定义了无状态编码器和解码器的功能接口:

Codec.encode(input[, errors])

编码对象的输入,并返回一个元组 (输出对象,消耗的长度)。对于实例,text encoding使用特定字符集编码将字符串对象转换为字节对象(例如,cp1252iso-8859-1 )。

errors参数定义要应用的错误处理。它默认为'strict'处理。

该方法可能不会将状态存储在Codec实例中。使用StreamWriter编解码器,必须保持状态才能使编码高效。

编码器必须能够处理零长度的输入,并返回一个输出的对象类型的空对象,在这种情况。

Codec.decode(input[, errors])

解码对象的输入,并返回一个元组 (输出对象,消耗的长度)。对于实例,对于text encoding,解码将使用特定字符集编码进行编码的字节对象转换为字符串对象。

对于文本编码和字节到字节编解码器,输入必须是字节对象或提供只读缓冲区接口的对象,例如缓冲区对象和内存映射文件。

errors参数定义要应用的错误处理。它默认为'strict'处理。

该方法可能不会将状态存储在Codec实例中。使用StreamReader编解码器,必须保持状态才能使解码高效。

解码器必须能够处理零长度的输入,并返回一个输出的对象类型的空对象,在这种情况。

7.2.1.3.增量编码和解码

IncrementalEncoderIncrementalDecoder类为增量编码和解码提供了基本接口。对输入的编码/解码不是通过对无状态编码器/解码器功能的一次调用来完成的,而是对多次调用encode() / decode()增量编码器/解码器在方法调用期间跟踪的编码解码过程。

encode() / decode()方法的调用的连接输出与所有单个输入合并为一个相同,并且此输入被编码/解码与无状态编码器/解码器。

7.2.1.3.1.IncrementalEncoder对象

IncrementalEncoder类用于在多个步骤中对输入进行编码。它定义了每个增量编码器必须定义要符合 Python 编解码器注册表的以下方法。

class codecs.IncrementalEncoder(errors='strict')

IncrementalEncoder实例的构造函数。

所有的增量式编码器必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

IncrementalEncoder可以通过提供错误关键字参数来实现不同的错误处理方案。有关可能的值,请参见Error Handlers

错误参数将分配到具有相同名称的属性。分配此属性可以在IncrementalEncoder对象的生命周期内在不同的错误处理策略之间切换。

encode(object[, final])

编码对象(考虑到编码器的当前状态),并返回生成的编码的对象。如果这是对encode() final的最后一次调用必须为true(默认值为false)。

reset

将编码器重置为初始状态。输出被丢弃:调用.encode(object, final = True),如果需要传递空字节或文本字符串,编码器并获得输出。

IncrementalEncoder.getstate()

返回编码器的当前状态,必须为整数。实现应确保0是最常见的状态。(比整数更复杂的状态可以通过编组/选择状态并将结果字符串的字节编码为整数来转换为整数)。

IncrementalEncoder.setstate(state)

将编码器的状态设置为状态state必须是由getstate()返回的编码器状态。

7.2.1.3.2.IncrementalDecoder Objects

IncrementalDecoder类用于以多个步骤对输入进行解码。它定义了每个增量的解码器必须定义要符合 Python 编解码器注册表的以下方法。

class codecs.IncrementalDecoder(errors='strict')

IncrementalDecoder实例的构造函数。

所有增量解码器必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

IncrementalDecoder可以通过提供错误关键字参数来实现不同的错误处理方案。有关可能的值,请参见Error Handlers

错误参数将分配到具有相同名称的属性。分配此属性可以在IncrementalDecoder对象的生命周期内在不同的错误处理策略之间切换。

decode(object[, final])

对象(考虑到解码器的当前状态) 进行解码,并返回所产生的解码的对象。如果这是对decode() final的最后一次调用必须为true(默认值为false)。如果最后是真的解码器必须完全解码输入,并必须刷新所有缓冲区。如果这是不可能的(例如,因为在输入结束处的不完整的字节序列),它必须启动错误处理,就像在无状态的情况下(这可能引发异常)。

reset()

将解码器重置为初始状态。

getstate()

返回解码器的当前状态。这必须是一个有两个项的元组,第一个必须是包含静态未解码输入的缓冲区。第二个必须是整数,并且可以是附加状态信息。(实现应确保0是最常见的附加状态信息。)如果该附加状态信息是0,则必须能够将解码器设置为没有输入缓冲的状态,并且将0作为附加状态信息,解码器的缓冲输入返回到先前状态,而不产生任何输出。(通过编组/选择信息并将结果字符串的字节编码为整数,可以将比整数更复杂的附加状态信息转换为整数)。

setstate(state)

将编码器的状态设置为状态state必须是由getstate()返回的解码器状态。

7.2.1.4.流编码和解码

StreamWriterStreamReader类提供了通用的工作接口,可以非常轻松地实现新的编码子模块。有关如何完成此操作的示例,请参见encodings.utf_8

7.2.1.4.1.StreamWriter对象

StreamWriter类是Codec的子类,并定义每个流写入器必须定义的以下方法,以便与Python编解码器注册表兼容。

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

StreamWriter实例的构造函数。

所有写入流必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

参数必须是用于写入文本或二进制数据的文件式对象,适用于特定编解码器。

StreamWriter可以通过提供错误关键字参数来实现不同的错误处理方案。有关基础流编解码器可能支持的标准错误处理程序,请参见Error Handlers

错误参数将分配到具有相同名称的属性。分配此属性可以在StreamWriter对象的生命周期内在不同的错误处理策略之间切换。

write(object)

写入到流编码的对象的内容。

writelines(list)

将串联的字符串列表写入流(可能通过重用write()方法)。标准字节到字节编解码器不支持此方法。

reset()

刷新和重置来保持状态使用的编解码器缓冲区。

调用此方法,应确保对输出数据投入允许附加的新的最新数据而无需重新扫描要恢复状态的整个流的干净状态。

除了上述方法,StreamWriter还必须继承来自基础流的所有其他方法和属性。

7.2.1.4.2.StreamReader对象

StreamReader类是Codec的子类,并定义了每个流读取器必须定义的以下方法,以便与Python编解码器注册表兼容。

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

StreamReader实例的构造方法。

所有流读者必须都提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

参数必须是用于读取文本或二进制数据的文件式对象,适用于特定编解码器。

StreamReader可以通过提供错误关键字参数来实现不同的错误处理方案。有关基础流编解码器可能支持的标准错误处理程序,请参见Error Handlers

错误参数将分配到具有相同名称的属性。分配此属性可以在StreamReader对象的生命周期内在不同的错误处理策略之间切换。

可以使用register_error()扩展错误参数的允许值集合。

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

流中的数据进行解码,并返回生成的对象。

chars参数表示要返回的解码代码点或字节数。read()方法不会返回比请求的更多的数据,但如果没有足够的可用,它可能返回更少。

size参数指示要解码读取的编码字节或代码点的大致最大数目。解码器可以修改此设置为适当。默认值为-1 指示读取和解码尽可能多地。此参数旨在防止必须在一个步骤中解码巨大的文件。

第一行标志表示如果稍后行上有解码错误,则只返回第一行就足够了。

该方法应该使用贪婪读取策略,这意味着它应当读取与编码和给定大小的定义内允许的数据一样多的数据,例如。如果可选的编码结束或状态标记在流上可用,这些应该也读。

readline([size[, keepends]])

从输入流中读取一行并返回已解码的数据。

size(如果给定)作为size参数传递给流的read()方法。

如果keepends为 false 将从返回的行中去除行尾。

readlines([sizehint[, keepends]])

读取所有行上输入可用流并将它们作为行的列表返回。

行尾使用的编解码器的解码方法实现的并被列入列表条目,如果keepends为 true。

sizehint如果给定,则作为read()方法的size参数传递。

reset()

重置来保持状态使用的编解码器缓冲区。

请注意没有流重新定位应该发生。这种方法主要是为了能够从解码错误中恢复。

除了上述方法,StreamReader还必须从底层流继承所有其他方法和属性。

7.2.1.4.3.StreamReaderWriter对象

StreamReaderWriter是一个方便的类,允许在读取和写入模式下工作的包装流。

该设计使得可以使用由lookup()函数返回的工厂函数来构造实例。

class codecs.StreamReaderWriter(stream, Reader, Writer, errors)

创建StreamReaderWriter实例。必须是一个类似文件的对象。ReaderWriter必须是提供StreamReaderStreamWriter接口的工厂函数或类。错误处理是以同样的方式界定为流的读者和作家。

StreamReaderWriter实例定义StreamReaderStreamWriter类的组合接口。从基础流,他们继承所有其他方法和属性。

7.2.1.4.4.StreamRecoder Objects

StreamRecoder将数据从一个编码转换为另一个,这在处理不同编码环境时有时很有用。

该设计使得可以使用由lookup()函数返回的工厂函数来构造实例。

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

Creates a StreamRecoder instance which implements a two-way conversion: encode and decode work on the frontend — the data visible to code calling read() and write(), while Reader and Writer work on the backend — the data in stream.

您可以使用这些对象做透明转码,例如拉丁语-1到UTF-8和回。

参数必须是类似文件的对象。

编码解码参数必须遵守Codec接口。ReaderWriter必须是分别提供StreamReaderStreamWriter接口对象的工厂函数或类。

错误处理是以同样的方式界定为流的读者和作家。

StreamRecoder实例定义StreamReaderStreamWriter类的组合接口。从基础流,他们继承所有其他方法和属性。

7.2.2.编码和Unicode

字符串作为0x0 - 0x10FFFF范围内的代码点序列存储在内部。(有关实现的详细信息,请参见 PEP 393一旦字符串对象在CPU和内存之外使用,字节序和这些数组如何存储为字节成为一个问题。与其他编解码器一样,将字符串序列化为字节序列称为编码,并且从字节序列重新创建字符串称为解码有各种不同的文本串行编解码器,它们是被称为text encodings的集合。

The simplest text encoding (called 'latin-1' or 'iso-8859-1') maps the code points 0-255 to the bytes 0x0-0xff, which means that a string object that contains code points above U+00FF can’t be encoded with this codec. Doing so will raise a UnicodeEncodeError that looks like the following (although the details of the error message may differ): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256).

还有另一组编码(所谓的charmap编码),它选择所有Unicode代码点的不同子集,以及这些代码点如何映射到字节0x0 - 0xff要了解如何完成此操作,只需打开例如encodings/cp1252.py(这是主要在Windows上使用的编码)。那里是显示你哪个字符映射到哪个字节值与 256 个字符的字符串常数。

所有这些编码只能编码Unicode中定义的1114112个代码点中的256个。可以存储每个Unicode代码点的简单和直接的方法是将每个代码点存储为四个连续字节。有两种可能性: 在大端或小端字节序顺序存储字节数。这两种编码分别称为UTF-32-BEUTF-32-LE它们的缺点是,您在小端机上使用UTF-32-BE,您将始终在编码和解码时交换字节。UTF-32避免了这个问题:字节将始终是自然的字节序。当这些字节读取 CPU 与不同字节排序方式时,字节为单位) 的就有虽然换。为了能够检测UTF-16UTF-32字节序列的字节顺序,存在所谓的BOM(“字节顺序标记”)。这是Unicode字符U+FEFF此字符可以预置到每个UTF-16UTF-32字节序列。此字符的字节交换版本(0xFFFE)是可能不会出现在Unicode文本中的非法字符。因此,当UTF-16UTF-32字节序列中的第一个字符出现为U+FFFE时,字节必须交换解码。很遗憾,字符U+FEFF的第二个用途是ZERO WIDTH NO-BREAK SPACE:没有宽度且不允许单词分割的字符。它可以例如。用于给连字算法提示。使用Unicode 4.0使用U+FEFF作为ZERO WIDTH NO-BREAK 假设此角色已弃用(使用U+2060WORD JOINER)) )。尽管如此,Unicode软件仍然必须能够在两种角色中处理U+FEFF:作为BOM,它是一种确定编码字节存储布局的设备,一旦字节序列被解码为串;作为ZERO WIDTH NO-BREAK SPACE解码像任何其他。

还有另一种编码,能够完整范围的 Unicode 字符编码: UTF-8。UTF-8 是一种 8 位编码,这意味着没有与 utf-8 字节顺序的问题。每个字节的 utf-8 字节序列由两部分组成: 标记位 (最高有效位) 和有效载荷位。标记位是0到4个1位的序列,后跟一个0位。Unicode 字符被编码为像这样 (带有 x 有效载荷位,当连接给 Unicode 字符):

范围编码
U-00000000 ... U-0000007F0xxxxxxx
U-00000080 ... U-000007FF110xxxxx 10xxxxxx
U-00000800 ... U-0000FFFF1110xxxx 10xxxxxx 10xxxxxx
U-00010000 ... U-0010FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode 字符的最低有效位是最右边的 x 位。

由于UTF-8是8位编码,因此不需要BOM,解码字符串中的任何U+FEFF字符(即使它是第一个字符)都被视为 WIDTH NO-BREAK SPACE

没有外部信息,不可能可靠地确定哪个编码用于编码字符串。Each charmap encoding can decode any random byte sequence. However that’s not possible with UTF-8, as UTF-8 byte sequences have a structure that doesn’t allow arbitrary byte sequences. 为了提高可以检测UTF-8编码的可靠性,微软发明了一个UTF-8的变种(Python 2.5调用"utf-8-sig"的Unicode字符写入文件,一个UTF-8编码的BOM(它看起来像一个字节序列:0xef0xbb0xbf因为任何charmap编码文件都以这些字节值开头是不太可能的。映射到

LATIN SMALL LETTER I WITH DIAERESIS
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
INVERTED QUESTION MARK

在iso-8859-1中),这增加了可以从字节序列正确猜测utf-8-sig编码的概率。这里不使用物料清单必须能够确定用于生成的字节序列的字节顺序,但作为签名,有助于在猜测的编码。在编码时,utf-8-sig编解码器将把0xef0xbb0xbf作为前三个字节写入文件。如果解码utf-8-sig将跳过这三个字节,如果它们显示为文件中的前三个字节。UTF-8,在物料清单的使用是气馁和通常应该避免。

7.2.3.标准编码

Python 带有大量的编解码器内置,要么实施作为 C 函数或词典作为映射表。下表列出了由几个常见的别名,并为其编码可能使用的语言的名称的编码解码器。别名的列表既的语言的列表就是要详尽无遗。请注意,只有不同的情况或使用连字符而不是下划线的拼写备选方案也是有效的别名;因此,例如。'utf-8''utf_8'编解码器的有效别名。

CPython实现细节:一些常见的编码可以绕过编解码器查找机制以提高性能。这些优化机会只能被CPython识别的一组有限的别名:utf-8,utf8,latin-1,latin1,iso-8859-1,mbcs(仅限Windows),ascii,utf-16和utf-32。对这些编码使用替代拼写可能会导致执行速度较慢。

很多字符集支持相同的语言。它们各不相同。是否支持EURO SIGN),以及将字符分配给代码位置。对于欧洲的语言特别是以下变形通常存在:

  • an ISO 8859 codeset
  • Microsoft Windows代码页,通常派生自8859代码集,但用附加的图形字符替换控制字符
  • an IBM EBCDIC code page
  • an IBM PC code page, which is ASCII compatible
编解码器别名语言
ascii646,us-ascii英语
big5big5-tw,csbig5繁体中文
big5hkscsbig5-hkscs,hkscs繁体中文
cp037IBM037,IBM039英语
cp273273,IBM273,csIBM273

德语

版本3.4中的新功能。

cp424EBCDIC-CP-HE,IBM424希伯来语
cp437437,IBM437英语
cp500EBCDIC-CP-BE,EBCDIC-CP-CH,IBM500西欧
cp720阿拉伯
cp737希腊语
cp775IBM775波罗的海语言
cp850850,IBM850西欧
cp852852,IBM852中欧和东欧
cp855855,IBM855保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
cp856希伯来语
cp857857,IBM857土耳其
cp858858,IBM858西欧
cp860860,IBM860葡萄牙语
cp861861,CP-IS,IBM861冰岛的
cp862862,IBM862希伯来语
cp863863,IBM863加拿大
cp864IBM864阿拉伯
cp865865,IBM865丹麦语,挪威语
cp866866,IBM866俄语
cp869869,CP-GR,IBM869希腊语
cp874泰国
cp875希腊语
cp932932,ms932,mskanji,ms-kanji日本
cp949949,ms949,uhc韩语
cp950950,ms950繁体中文
cp1006乌尔都语
cp1026ibm1026土耳其
cp11251125,ibm1125,cp866u,ruscii

乌克兰

版本3.4中的新功能。

cp1140ibm1140西欧
cp1250windows-1250中欧和东欧
cp1251windows-1251保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
cp1252windows-1252西欧
cp1253windows-1253希腊语
cp1254windows-1254土耳其
cp1255windows-1255希伯来语
cp1256windows-1256阿拉伯
cp1257windows-1257波罗的海语言
cp1258windows-1258越南语
cp65001

仅限Windows:Windows UTF-8(CP_UTF8

版本3.3中的新功能。

euc_jpeucjp, ujis, u-jis日本
euc_jis_2004jisx0213,eucjis2004日本
euc_jisx0213eucjisx0213日本
euc_kreuckr,korean,ksc5601,ks_c-5601,ks_c-5601-1987,ksx1001,ks_x-1001韩语
gb2312chinese, csiso58gb231280, euc- cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso- ir-58简体中文
gbk936,cp936,ms936统一中文
gb18030gb18030-2000统一中文
赫兹hzgb,hz-gb,hz-gb-2312简体中文
iso2022_jpcsiso2022jp,iso2022jp,iso-2022-jp日本
iso2022_jp_1iso2022jp-1,iso-2022-jp-1日本
iso2022_jp_2iso2022jp-2,iso-2022-jp-2日语,韩语,简体中文,西欧,希腊语
iso2022_jp_2004iso2022jp-2004,iso-2022-jp-2004日本
iso2022_jp_3iso2022jp-3,iso-2022-jp-3日本
iso2022_jp_extiso2022jp-ext,iso-2022-jp-ext日本
iso2022_krcsiso2022kr,iso2022kr,iso-2022-kr韩语
latin_1iso-8859-1,iso8859-1,8859,cp819,latin,latin1,L1西欧
iso8859_2iso-8859-2,latin2,L2中欧和东欧
iso8859_3iso-8859-3,latin3,L3世界语,马耳他语
iso8859_4iso-8859-4,latin4,L4波罗的海语言
iso8859_5iso-8859-5, cyrillic保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
iso8859_6iso-8859-6,arabic阿拉伯
iso8859_7iso-8859-7,greek,greek8希腊语
iso8859_8iso-8859-8,hebrew希伯来语
iso8859_9iso-8859-9, latin5, L5土耳其
iso8859_10iso-8859-10,latin6,L6北欧语言
iso8859_11iso-8859-11泰语
iso8859_13iso-8859-13,latin7,L7波罗的海语言
iso8859_14iso-8859-14,latin8,L8凯尔特语
iso8859_15iso-8859-15,latin9,L9西欧
iso8859_16iso-8859-16,latin10,L10东南欧
johabcp1361,ms1361韩语
koi8_r俄语
koi8_t

塔吉克

版本3.5中的新功能。

koi8_u乌克兰
kz1048kz_1048,strk1048_2002,rk1048

哈萨克

版本3.5中的新功能。

mac_cyrillicmaccyrillic保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
mac_greekmacgreek希腊语
mac_icelandmaciceland冰岛的
mac_latin2maclatin2,maccentraleurope中欧和东欧
mac_romanmacroman,macintosh西欧
mac_turkishmacturkish土耳其
ptcp154csptcp154, pt154, cp154, cyrillic-asian哈萨克
shift_jiscsshiftjis,shiftjis,sjis,s_jis日本
shift_jis_2004shiftjis2004,sjis_2004,sjis2004日本
shift_jisx0213shiftjisx0213,sjisx0213,s_jisx0213日本
utf_32U32,utf32所有语言
utf_32_beUTF-32BE所有语言
utf_32_leUTF-32LE所有语言
utf_16U16,utf16所有语言
utf_16_beUTF-16BE所有语言
utf_16_leUTF-16LE所有语言
utf_7U7,unicode-1-1-utf-7所有语言
utf_8U8,UTF,utf8所有语言
utf_8_sig所有语言

在版本3.4中更改: utf-16 *和utf-32 *编码器不再允许代理码点(U+D800 - U+DFFFutf-32 *解码器不再解码对应于代理码点的字节序列。

7.2.4.Python特定编码

大量的预定义的编码解码器是特定于 Python 是一种,所以他们的编解码器名字有外 Python 没有意义。这些都是基于预期的输入和输出类型 (请注意尽管文本编码是最常见的使用情况,为编解码器,基础的编解码器支持任意数据转换,而不是只是文本编码) 以下的表格中列出。对于不对称的编解码器,所述的目的描述编码方向。

7.2.4.1.文本编码

以下编解码器提供strbytes编码和bytes-like objectstr解码,类似于Unicode文本编码。

编解码器别名目的
idna实现 RFC 3490,另请参见encodings.idna仅支持errors='strict'
mbcsdbcsWindows only: Encode operand according to the ANSI codepage (CP_ACP)
palmosEncoding of PalmOS 3.5
punycode实现 RFC 3492不支持有状态的编解码器。
raw_unicode_escape对于其他代码点,使用\uXXXX\UXXXXXXXX进行拉丁语-1编码。现有反斜杠不以任何方式转义。它用于Python pickle协议。
未定义引发所有转换(甚至是空字符串)的异常。错误处理程序被忽略。
unicode_escape在ASCII编码的Python源代码中,编码适合作为Unicode字面值的内容,但引号不会转义。从Latin-1源代码解码。注意,Python源代码实际上默认使用UTF-8。
unicode_internal

返回操作数的内部表示。不支持有状态的编解码器。

自版本3.3后已弃用:此表示已由 PEP 393取代。

7.2.4.2.二进制变换

以下编解码器提供二进制变换:bytes-like objectbytes映射。bytes.decode()(仅生成str输出)不支持它们。

编解码器别名目的编码器/解码器
base64_codec [1]base64,base_64

将操作数转换为多行MIME base64(结果始终包含尾随'\n'

在版本3.4中更改:接受任何bytes-like object作为编码和解码的输入

base64.encodebytes() / base64.decodebytes()
bz2_codecbz2Compress the operand using bz2bz2.compress() / bz2.decompress()
hex_codec十六进制Convert operand to hexadecimal representation, with two digits per bytebinascii.b2a_hex() / binascii.a2b_hex()
quopri_codecquopri,quotedprintable,quoted_printableConvert operand to MIME quoted printablequopri.encode()quotetabs=True / quopri.decode()
uu_codecuuConvert the operand using uuencodeuu.encode() / uu.decode()
zlib_codeczip,zlibCompress the operand using gzipzlib.compress() / zlib.decompress()
[1]除了bytes-like objects'base64_codec'也接受str的仅ASCII实例用于解码

版本3.2中的新功能:恢复二进制转换。

在版本3.4中更改:恢复二进制变换的别名。

7.2.4.3.文本转换

以下编解码器提供文本转换:strstr映射。str.encode()(仅生成bytes输出)不支持。

编解码器别名目的
rot_13rot13Returns the Caesar-cypher encryption of the operand

版本3.2中的新功能:恢复rot_13文本转换。

在版本3.4中更改:恢复rot13别名。

7.2.5. encodings.idna - 应用程序中的国际化域名

此模块实现 RFC 3490(应用程序中的国际化域名)和 RFC 3492(Nameprep:A Stringprep Profile for国际化域名(IDN))。它建立在punycode编码和stringprep之上。

这些 Rfc 一起定义的协议,支持非 ASCII 字符的域名。包含非ASCII字符(如www.Alliancefrançaise.nu)的域名将转换为ASCII兼容的编码(ACE,例如www.xn--alliancefranaise-npb.nu)。在所有的地方,在那里任意字符不允许的协议,例如 DNS 查询,HTTP主机字段等等然后使用 ACE 形式的域的名称。这种转换在应用程序中执行;如果可能对用户不可见:应用程序应将Unicode域标签透明地转换为IDNA,并将ACE标签转换回Unicode,然后再将其显示给用户。

Python supports this conversion in several ways: the idna codec performs conversion between Unicode and ACE, separating an input string into labels based on the separator characters defined in section 3.1 (1) of RFC 3490 and converting each label to ACE as required, and conversely separating an input byte string into labels based on the .分隔符并将任何找到的ACE标签转换为unicode。此外,socket模块将Unicode主机名透明地转换为ACE,以便应用程序在将主机名传递给套接字模块时不必关心主机名本身的转换。On top of that, modules that have host names as function parameters, such as http.client and ftplib, accept Unicode host names (http.client then also transparently sends an IDNA hostname in the Host field if it sends that field at all).

当接收主机名称从导线 (如反向名称查找),没有自动转换为 Unicode 执行: 想要向用户显示这些主机名的应用程序应该向 Unicode 解码它们。

模块encodings.idna还实现nameprep过程,其对主机名执行某些规范化,以实现国际域名的不区分大小写,以及统一相似的字符。如果需要,可以直接使用 nameprep 函数。

encodings.idna。 t>> nameprep 标签 ¶ t5 >

返回标签的 nameprepped 版本。实现当前假设查询字符串,因此AllowUnassigned为true。

encodings.idna。 t>> 标签 >

将标签转换为ASCII,如 RFC 3490中所指定。UseSTD3ASCIIRules假定为false。

encodings.idna t>> ToUnicode 标签 ¶ t5 >

将标签转换为Unicode,如 RFC 3490中所指定。

7.2.6. encodings.mbcs - Windows ANSI代码页

根据ANSI代码页(CP_ACP)编码操作数。

可用性:仅限Windows。

在版本3.3中更改:支持任何错误处理程序。

在版本3.2中更改:在3.2之前,错误参数被忽略; 'replace'始终用于编码,'ignore'进行解码。

7.2.7. encodings.utf_8_sig - 具有BOM声音的UTF-8编解码器

这个模块实现了 UTF-8 编码解码器的 variant 类型: 对编码 utf-8 编码物料清单将预置到 UTF-8 编码的字节。状态编码器这只是一次 (在首次向字节流的形式写入)。为解码可选的 utf-8 编码的 BOM 数据的开头将被跳过。