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

源代码: Lib / codecs.py

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

该模块为任何编解码器定义了以下编码和解码功能:

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

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

Errors may be given to set the desired error handling scheme. 默认错误处理程序是'strict',这意味着编码错误会引发ValueError(或更多的特定于codec的子类,如UnicodeEncodeError)。有关编解码器错误处理的更多信息,请参阅Codec Base Classes

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

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

Errors may be given to set the desired error handling scheme. 默认错误处理程序是'strict',这意味着解码错误会引发ValueError(或更多的编解码器特定子类,例如UnicodeDecodeError)。有关编解码器错误处理的更多信息,请参阅Codec Base Classes

每个编解码器的全部细节也可以直接查询:

codecs.lookup(encoding)

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

编码首先在注册表的缓存中查找。如果未找到,则会扫描已注册搜索功能的列表。If no CodecInfo object is found, a LookupError is raised. 否则,CodecInfo对象存储在缓存中并返回给调用者。

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

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

name

编码的名称。

encode
decode

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

incrementalencoder
incrementaldecoder

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

streamwriter
streamreader

流式写入器和读取器类或工厂功能。这些必须分别提供由基类StreamWriterStreamReader定义的接口。流编解码器可以维护状态。

为了简化对各种编解码器组件的访问,模块提供了使用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)

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

注意

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

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

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

使用给定的模式打开编码文件并返回StreamReaderWriter的实例,从而提供透明的编码/解码。默认文件模式是'r',这意味着以读取模式打开文件。

注意

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

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

errors可能会给出了定义的错误处理。它默认为'strict',如果发生编码错误,会导致引发ValueError

缓冲与内置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)

使用增量编码器迭代编码迭代器提供的输入。这个函数是一个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编码的BOM。

7.2.1.编解码器基类

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

每个编解码器必须定义四个接口,以使其可用作Python中的编解码器:无状态编码器,无状态解码器,流读取器和流编写器。流读取器和写入器通常重新使用无状态编码器/解码器来实现文件协议。编解码器作者还需要定义编解码器将如何处理编码和解码错误。

7.2.1.1.错误处理程序

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

含义
'strict'提升UnicodeError(或一个子类);这是默认值。strict_errors()中实现。
'ignore'忽略格式错误的数据,并继续不另行通知。ignore_errors()中实现。

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

含义
'replace'替换为合适的替换标记; Python将使用正式的U+FFFD替换字符作为解码时的内置编解码器,编码时使用'?'。replace_errors()
'xmlcharrefreplace'替换为适当的XML字符引用(仅用于编码)。xmlcharrefreplace_errors()中实现。
'backslashreplace'用反斜杠转义序列替换。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-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)

在名称name下注册错误处理函数error_handlerThe error_handler argument will be called during encoding and decoding in case of an error, when name is specified as the errors parameter.

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

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

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

codecs.lookup_error(name)

返回之前在名称name下注册的错误处理程序。

如果找不到处理程序,则引发LookupError

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

codecs.strict_errors(exception)

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

codecs.replace_errors(exception)

实现'replace'错误处理(仅用于text encodings):替换'?' for encoding errors (to be encoded by the codec), and '\ufffd' (the Unicode replacement character) for decoding errors.

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])

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

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

该方法可能不会在Codec实例中存储状态。使用StreamWriter来编码,这些编解码器必须保持状态才能使编码更有效率。

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

Codec.decode(input[, errors])

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

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

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

该方法可能不会在Codec实例中存储状态。对于必须保持状态的编解码器,使用StreamReader以使解码效率更高。

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

7.2.1.3.增量编码和解码

The IncrementalEncoder and IncrementalDecoder classes provide the basic interface for incremental encoding and decoding. 编码/解码输入不是通过一次调用无状态编码器/解码器函数完成的,而是通过对encode() / decode()方法的多次调用增量编码器/解码器。增量编码器/解码器在方法调用期间跟踪编码/解码过程。

encode() / decode()方法的调用的联合输出与将所有单个输入合并为一个并且该输入被编码/解码与无状态编码器/解码器。

7.2.1.3.1.IncrementalEncoder对象

IncrementalEncoder类用于以多个步骤对输入进行编码。它定义了每个增量编码器必须定义的以下方法,以便与Python编解码器注册表兼容。

class codecs.IncrementalEncoder(errors='strict')

IncrementalEncoder实例的构造函数。

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

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

errors参数将被分配给同名的属性。赋值给该属性可以在IncrementalEncoder对象的生命周期内在不同的错误处理策略之间切换。

encode(object[, final])

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

重置 T0> ( T1> ) T2> ¶ T3>

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

IncrementalEncoder.getstate()

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

IncrementalEncoder.setstate(state)

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

7.2.1.3.2.IncrementalDecoder对象

IncrementalDecoder类用于多步骤解码输入。它定义了每个增量解码器必须定义的以下方法,以便与Python编解码器注册表兼容。

class codecs.IncrementalDecoder(errors='strict')

IncrementalDecoder实例的构造函数。

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

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

errors参数将被分配给同名的属性。赋值给该属性可以在IncrementalDecoder对象的生命周期内在不同的错误处理策略之间切换。

decode(object[, final])

解码object(考虑到解码器的当前状态)并返回结果解码对象。如果这是最后一次调用decode() final必须为true(默认值为false)。如果final为真,则解码器必须彻底解码输入,并且必须清空所有缓冲区。如果这是不可能的(例如由于输入末尾的字节序列不完整),它必须启动错误处理,就像在无状态的情况下(这可能会引发异常)。

reset()

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

getstate()

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

setstate(state)

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

7.2.1.4.流编码和解码

The StreamWriter and StreamReader classes provide generic working interfaces which can be used to implement new encoding submodules very easily. 有关如何完成的示例,请参阅encodings.utf_8

7.2.1.4.1.StreamWriter对象

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

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

StreamWriter实例的构造函数。

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

根据特定编解码器的情况,stream参数必须是一个类似文件的对象,用于写入文本或二进制数据。

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

errors参数将被分配给同名的属性。分配给该属性可以在StreamWriter对象的生命周期内在不同的错误处理策略之间切换。

write(object)

将编码对象的内容写入流中。

writelines(list)

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

reset()

刷新并重置用于保持状态的编解码器缓冲区。

调用此方法应确保将输出中的数据置于干净状态,以允许附加新的新数据,而无需重新扫描整个流以恢复状态。

In addition to the above methods, the StreamWriter must also inherit all other methods and attributes from the underlying stream.

7.2.1.4.2.StreamReader对象

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

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

StreamReader实例的构造函数。

所有流读取器都必须提供此构造器接口。他们可以自由添加额外的关键字参数,但只有在这里定义的关键字参数被Python编解码器注册表使用。

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

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

errors参数将被分配给同名的属性。分配给该属性可以在StreamReader对象的生命周期内在不同的错误处理策略之间切换。

errors参数的允许值组可以通过register_error()扩展。

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

解码流中的数据并返回结果对象。

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

size参数表示要解码时读取的编码字节或编码点的近似最大数量。解码器可以根据需要修改此设置。默认值-1表示尽可能多地读取和解码。该参数旨在防止在一个步骤中解码大文件。

The firstline flag indicates that it would be sufficient to only return the first line, if there are decoding errors on later lines.

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

readline([size[, keepends]])

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

size, if given, is passed as size argument to the stream’s read() method.

如果keepends为假行结束符将从返回的行中剥离。

readlines([sizehint[, keepends]])

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

如果keepends为true,则使用编解码器的解码器方法实现行结束符,并将其包含在列表条目中。

sizehint, if given, is passed as the size argument to the stream’s read() method.

reset()

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

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

In addition to the above methods, the StreamReader must also inherit all other methods and attributes from the underlying stream.

7.2.1.4.3.StreamReaderWriter对象

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

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

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

创建一个StreamReaderWriter实例。stream must be a file-like object. ReaderWriter必须是提供StreamReaderStreamWriter接口的工厂函数或类。错误处理以与流读取器和写入器定义相同的方式完成。

StreamReaderWriter instances define the combined interfaces of StreamReader and StreamWriter classes. 它们从基础流继承所有其他方法和属性。

7.2.1.4.4.StreamRecoder对象

The StreamRecoder translates data from one encoding to another, which is sometimes useful when dealing with different encoding environments.

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

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

创建一个实现双向转换的StreamRecoder实例:编码解码在前端工作 - 数据可见代码调用read()write(),而ReaderWriter在后端工作 - / T11>。

您可以使用这些对象来执行透明转码。Latin-1转换为UTF-8并返回。

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

encodedecode参数必须遵守Codec接口。Reader and Writer must be factory functions or classes providing objects of the StreamReader and StreamWriter interface respectively.

错误处理以与流读取器和写入器定义相同的方式完成。

StreamRecoder instances define the combined interfaces of StreamReader and StreamWriter classes. 它们从基础流继承所有其他方法和属性。

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代码点的简单而直接的方法是将每个代码点存储为四个连续的字节。有两种可能性:以big endian或little endian顺序存储字节。这两种编码分别称为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时,字节必须交换在解码。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. 它可以例如用于提示连字算法。使用Unicode 4.0使用U+FEFF作为ZERO WIDTH NO-BREAK / t6>已被弃用(与U+2060WORD JOINER) )。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-0000007F0xxxxxxx
U-00000080 ... U-000007FF110xxxxx 10xxxxxx
U-00000800 ... U-0000FFFF1110xxxx 10xxxxxx 10xxxxxx
U-00010000 ... U-0010FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

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

As UTF-8 is an 8-bit encoding no BOM is required and any U+FEFF character in the decoded string (even if it’s the first character) is treated as a ZERO WIDTH NO-BREAK SPACE.

没有外部信息,就不可能可靠地确定使用哪种编码来编码字符串。每个charmap编码可以解码任何随机字节序列。但UTF-8无法实现,因为UTF-8字节序列具有不允许任意字节序列的结构。为了提高可检测到UTF-8编码的可靠性,Microsoft发明了记事本程序的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编码的可能性。所以这里的BOM并不能用于确定用于生成字节序列的字节顺序,而是用作帮助猜测编码的签名。On encoding the utf-8-sig codec will write 0xef, 0xbb, 0xbf as the first three bytes to the file. On decoding utf-8-sig will skip those three bytes if they appear as the first three bytes in the file. 在UTF-8中,不鼓励使用BOM,通常应避免使用。

7.2.3.标准编码

Python带有一些内置的编解码器,可以作为C函数或字典作为映射表来实现。下表按名称列出了编解码器,以及一些常用别名,以及可能使用编码的语言。别名列表和语言列表都不是详尽无遗的。请注意,仅在大小写不同的情况下使用拼写替代方法或使用连字符而不是下划线也是有效的别名;因此,例如'utf-8''utf_8'编解码器的有效别名。

CPython implementation detail: Some common encodings can bypass the codecs lookup machinery to improve performance. 这些优化机会仅由CPython针对一组有限的别名识别:utf-8,utf8,latin-1,latin1,iso-8859-1,mbcs(仅限Windows),ascii,utf-16和utf-32。对这些编码使用替代拼写可能导致执行速度变慢。

许多字符集都支持相同的语言。它们在个别字符(例如是否支持EURO SIGN)以及将字符分配给代码位置。对于欧洲语言尤其如此,通常存在以下变体:

  • ISO 8859代码集
  • 一个Microsoft Windows代码页,通常从8859代码集派生而来,但用其他图形字符替换控制字符
  • 一个IBM EBCDIC代码页
  • IBM PC代码页,与ASCII兼容
编解码器别名语言
ASCII646,us-ascii英语
中文big5-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西欧
CP1250窗户-1250中欧和东欧
CP1251窗户-1251保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
CP1252窗口1252西欧
cp1253窗户-1253希腊语
cp1254窗户-1254土耳其
cp1255窗户-1255希伯来语
cp1256窗户-1256阿拉伯
cp1257窗户-1257波罗的语言
cp1258窗户-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,8889,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,阿拉伯语阿拉伯
iso8859_7iso-8859-7,希腊语,希腊语8希腊语
iso8859_8iso-8859-8,希伯来语希伯来语
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东南欧
裘哈cp1361,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_roman宏观人,麦金托什西欧
mac_turkishmacturkish土耳其
ptcp154csptcp154, pt154, cp154, cyrillic-asian哈萨克人
shift_jis访问csshiftjis,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'
MBCSDBCS仅Windows:根据ANSI代码页(CP_ACP)对操作数进行编码
的PalmOSPalmOS 3.5的编码
Punycode码实现 RFC 3492不支持状态编解码器。
raw_unicode_escape对于其他代码点,使用\uXXXX\UXXXXXXXX进行Latin-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'

Changed in version 3.4: accepts any bytes-like object as input for encoding and decoding

base64.encodebytes() / base64.decodebytes()
bz2_codecBZ2使用bz2压缩操作数bz2.compress() / bz2.decompress()
hex_codec十六进制将操作数转换为十六进制表示,每个字节有两位数字binascii.b2a_hex() / binascii.a2b_hex()
quopri_codecquopri,quotedprintable,quoted_printable将操作数转换为可引用的MIME引用quopri.encode() with quotetabs=True / quopri.decode()
uu_codecUU使用uuencode转换操作数uu.encode() / uu.decode()
zlib_codeczip,zlib使用gzip压缩操作数zlib.compress() / zlib.decompress()
[1] T0>bytes-like objects外,'base64_codec'还接受str的仅ASCII码实例进行解码

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

Changed in version 3.4: Restoration of the aliases for the binary transforms.

7.2.4.3.文本转换

下面的编解码器提供了一个文本转换:一个strstr映射。它不受str.encode()(仅产生bytes输出)的支持。

编解码器别名目的
rot_13ROT13返回操作数的凯撒密码加密

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

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

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

This module implements RFC 3490 (Internationalized Domain Names in Applications) and RFC 3492 (Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN)). 它建立在punycode编码和stringprep上。

这些RFC一起定义了一个协议来支持域名中的非ASCII字符。包含非ASCII字符的域名(如www.Alliancefrançaise.nu)将转换为ASCII兼容编码(ACE,如www.xn--alliancefranaise-npb.nu然后,域名的ACE格式将用于协议不允许任意字符的所有地方,例如DNS查询,HTTP Host字段等。该转换在应用程序中执行;如果可能的话对用户不可见:应用程序应该在线上将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。 T0> NAMEPREP T1> ( T2> 标签 T3> ) T4> ¶ T5 >

返回标签的名称准备版本。该实现目前假定查询字符串,因此AllowUnassigned为true。

encodings.idna。 T0> toascii将 T1> ( T2> 标签 T3> ) T4> ¶ T5 >

按照 RFC 3490的规定将标签转换为ASCII。UseSTD3ASCIIRules is assumed to be false.

encodings.idna。 T0> ToUnicode T1> ( T2> 标签 T3> ) T4> ¶ T5 >

按照 RFC 3490的规定将标签转换为Unicode。

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编解码器的一种变体:在编码时,UTF-8编码的BOM将被添加到UTF-8编码的字节中。对于有状态编码器,这只会执行一次(在第一次写入字节流时)。在数据开始时解码可选的UTF-8编码BOM将被跳过。