You are here:  Home » Python » 二进制数据服务模块之codecs- 编解码器注册表和基类(19)Python语言(必读进阶学习教程)(参考资料)

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

该模块定义了以下用于使用任何编解码器进行编码和解码的函数:

codecs.encodeobjencoding =’utf-8′errors =’strict’ 
编码OBJ使用注册的编解码器编码

可以给出错误以设置期望的错误处理方案。默认错误处理程序'strict'意味着编码错误会增加ValueError(或者更多编解码器特定的子类,例如 UnicodeEncodeError)。有关编解码器错误处理的更多信息,请参阅编解码器基类

codecs.decodeobjencoding =’utf-8′errors =’strict’ 
解码OBJ使用注册的编解码器编码

可以给出错误以设置期望的错误处理方案。默认错误处理程序'strict'意味着解码错误会增加ValueError(或者更多编解码器特定的子类,例如 UnicodeDecodeError)。有关编解码器错误处理的更多信息,请参阅编解码器基类

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

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

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

class codecs.CodecInfoencodedecodestreamreader = Nonestreamwriter = Noneincrementalencoder = Noneincrementaldecoder = Nonename = None 
查找编解码器注册表时的编解码器详细信息。构造函数参数存储在同名的属性中:

name
编码的名称。
encode
decode
无状态编码和解码功能。这些必须是与Codec实例encode()decode()方法具有相同接口的函数或方法(请参阅编解码器接口)。期望功能或方法在无状态模式下工作。
incrementalencoder
incrementaldecoder
增量编码器和解码器类或工厂功能。这些必须提供由所述基类定义的接口 IncrementalEncoderIncrementalDecoder分别。增量编解码器可以维持状态。
streamwriter
streamreader
流编写器和读取器类或工厂函数。这些必须提供由所述基类定义的接口 StreamWriterStreamReader分别。流编解码器可以维护状态。

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

codecs.getencoder编码
查找给定编码的编解码器并返回其编码器功能。

LookupError如果找不到编码,则引发a 。

codecs.getdecoder编码
查找给定编码的编解码器并返回其解码器功能。

LookupError如果找不到编码,则引发a 。

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

LookupError如果无法找到编码或编解码器不支持增量编码器,则引发。

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

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

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

LookupError如果找不到编码,则引发a 。

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

LookupError如果找不到编码,则引发a 。

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

codecs.registersearch_function 
注册编解码器搜索功能。搜索函数应该采用一个参数,即所有小写字母的编码名称,并返回一个 CodecInfo对象。如果搜索功能无法找到给定的编码,则应返回None

注意

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

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

codecs.openfilenamemode =’r’encoding = Noneerrors =’strict’buffering = 1 
使用给定模式打开编码文件并返回实例 StreamReaderWriter,提供透明编码/解码。默认文件模式是'r',意味着以读取模式打开文件。

注意

底层编码文件始终以二进制模式打开。'\n'在读写时不进行自动转换。所述模式参数可以是任何二进制模式可接受的内置 open()功能; 的'b'自动添加。

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

可以给出错误来定义错误处理。默认情况下'strict' 会导致ValueError在发生编码错误时引发a 。

缓冲具有与内置open()函数相同的含义。它默认为行缓冲。

codecs.EncodedFile文件data_encodingfile_encoding =无误差= ‘严格’ 
返回一个StreamRecoder实例,一个 提供透明转码的文件的包装版本。关闭包装版本时,原始文件将关闭。

写入包裹文件数据被根据给定的解码 data_encoding,然后写入到原来的文件作为字节使用 file_encoding。字节从原始文件读出是根据解码file_encoding,其结果是使用编码data_encoding

如果file_encoding没有给出,则默认为data_encoding

可以给出错误来定义错误处理。它默认为 'strict',导致ValueError在发生编码错误时引发。

codecs.iterencode迭代器编码错误=’严格’** kwargs 
使用增量编码器迭代编码迭代器提供的输入 。这个功能是一个发电机。的误差参数(以及任何其他关键字参数)通过以增量编码器通过。

此函数要求编解码器接受str要编码的文本对象。因此它不支持字节到字节的编码器,例如 base64_codec

codecs.iterdecode迭代器编码错误=’严格’** kwargs 
使用增量解码器迭代解码迭代器提供的输入 。这个功能是一个发电机。的误差参数(以及任何其他关键字参数)通过以增量解码器通过。

此函数要求编解码器接受bytes要解码的对象。因此,它不支持文本到文本编码器,例如 rot_13,虽然rot_13可以等效地使用 iterencode()

该模块还提供以下常量,这些常量对于读取和写入平台相关文件非常有用:

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是for BOM_UTF16, BOM_LEfor BOM_UTF16_LEBOM_BEfor 的别名BOM_UTF16_BE。其他代表UTF-8和UTF-32编码的BOM。

 

编解码器基类

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

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

 

错误处理程序

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

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

以下错误处理程序仅适用于 文本编码

含义
'replace' 更换合适的替换标记; Python将U+FFFD在解码时使用官方的REPLACEMENT CHARACTER作为内置编解码器,并且’?’ 在编码上。实施于 replace_errors()
'xmlcharrefreplace' 替换为适当的XML字符引用(仅用于编码)。实施于xmlcharrefreplace_errors()
'backslashreplace' 替换为backslashed转义序列。实施于 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_errornameerror_handler 
在名称名称下注册错误处理函数error_handler。该error_handler参数将编码和解码过程中的错误的情况下被调用,当名称被指定为误差参数。

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

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

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

codecs.lookup_error名字
返回先前在名称名称下注册的错误处理程序。

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

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

codecs.strict_errors例外
实现'strict'错误处理:每个编码或解码错误都会引发错误UnicodeError
codecs.replace_errors例外
实现'replace'错误处理(仅用于文本编码):替换'?'编码错误(由编解码器编码)和'\ufffd'(Unicode替换字符)用于解码错误。
codecs.ignore_errors例外
实现'ignore'错误处理:忽略格式错误的数据,并继续编码或解码,恕不另行通知。
codecs.xmlcharrefreplace_errors例外
实现'xmlcharrefreplace'错误处理(仅用于使用 文本编码进行编码):将不可编码的字符替换为适当的XML字符引用。
codecs.backslashreplace_errors例外
实现'backslashreplace'错误处理(仅适用于 文本编码):格式错误的数据由反斜杠转义序列替换。
codecs.namereplace_errors例外
实现'namereplace'错误处理(仅用于使用 文本编码进行编码):将不可编码的字符替换为\N{...}转义序列。

版本3.5中的新功能。

 

无状态编码和解码

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

Codec.encode输入[错误
对对象输入进行编码并返回元组(输出对象,消耗的长度)。例如,文本编码使用特定字符集编码(例如,cp1252iso-8859-1)将字符串对象转换为字节对象。

错误参数定义错误处理申请。它默认为'strict'处理。

该方法可能不会在Codec实例中存储状态。使用 StreamWriter了其必须保持状态,以便使编码效率的编解码器。

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

Codec.decode输入[错误
解码对象输入并返回元组(输出对象,消耗的长度)。例如,对于文本编码,解码将使用特定字符集编码编码的字节对象转换为字符串对象。

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

错误参数定义错误处理申请。它默认为'strict'处理。

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

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

增量编码和解码

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

encode()decode()method 的调用的连接输出与将 所有单个输入连接成一个输入相同,并且该输入使用无状态编码器/解码器进行编码/解码。

 

IncrementalEncoder对象

IncrementalEncoder类是用于在多个步骤中编码的输入。它定义了以下方法,每个增量编码器必须定义这些方法才能与Python编解码器注册表兼容。

class codecs.IncrementalEncodererrors =’strict’ 
IncrementalEncoder实例的构造函数。

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

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

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

encode对象[最终
编码对象(考虑编码器的当前状态)并返回结果编码对象。如果这是对final的最后一次调用 必须为true(默认为false)。encode()
reset
将编码器重置为初始状态。输出被丢弃:调用 ,必要时传递空字节或文本字符串,以重置编码器并获得输出。.encode(object, final=True)
getstate
返回编码器的当前状态,该状态必须是整数。实施应该确保这0是最常见的状态。(比整数更复杂的状态可以通过编组/选择状态并将结果字符串的字节编码为整数来转换为整数)。
setstate状态
将编码器的状态设置为statestate必须是返回的编码器状态getstate()

 

IncrementalDecoder对象

IncrementalDecoder类是用于在多个步骤中进行解码的输入。它定义了以下方法,每个增量解码器必须定义这些方法才能与Python编解码器注册表兼容。

class codecs.IncrementalDecodererrors =’strict’ 
IncrementalDecoder实例的构造函数。

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

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

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

decode对象[最终
解码对象(考虑解码器的当前状态)并返回结果解码对象。如果这是对final的最后一次调用 必须为true(默认为false)。如果final为真,则解码器必须完全解码输入并且必须刷新所有缓冲区。如果这是不可能的(例如,由于输入结束时字节序列不完整),它必须启动错误处理,就像无状态情况一样(这可能引发异常)。decode()
reset
将解码器重置为初始状态。
getstate
返回解码器的当前状态。这必须是包含两个项的元组,第一个必须是包含仍然未解码的输入的缓冲区。第二个必须是整数,可以是其他状态信息。(实现应该确保这0是最常见的附加状态信息。)如果这个额外的状态信息是0必须可以将解码器设置为没有输入缓冲0的状态和 作为附加状态信息,以便以前提供缓冲输入到解码器将其返回到先前的状态而不产生任何输出。(通过编组/选取信息并将结果字符串的字节编码为整数,可以将比整数更复杂的附加状态信息转换为整数。)
setstate状态
将编码器的状态设置为statestate必须是返回的解码器状态getstate()

流编码和解码

StreamWriterStreamReader类提供可用于非常容易地实现新的编码子模块的通用的工作界面。请参阅有关encodings.utf_8如何完成此操作的示例。

 

StreamWriter对象

StreamWriter类是的一个子类Codec,并且限定其中每个流作家必须按顺序定义以下方法为与编解码器的Python注册表兼容。

class codecs.StreamWriterstreamerrors =’strict’ 
StreamWriter实例的构造函数。

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

参数必须是一个类似文件的对象打开用于写入文本或二进制数据,以适合特定的编解码器。

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

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

write对象
将对象的内容编码写入流。
writelines列表
将串联的字符串列表写入流(可能通过重用该write()方法)。标准的字节到字节编解码器不支持此方法。
reset
刷新并重置用于保持状态的编解码器缓冲区。

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

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

 

StreamReader对象

StreamReader类是的一个子类Codec,并且限定其中每个流读取器必须按顺序定义以下方法为与编解码器的Python注册表兼容。

class codecs.StreamReaderstreamerrors =’strict’ 
StreamReader实例的构造函数。

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

参数必须是一个类文件对象开放阅读文本或二进制数据,以适合特定的编解码器。

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

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

可以使用扩展errors参数 的允许值集register_error()

readsize [chars [firstline 
解码流中的数据并返回结果对象。

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

所述尺寸参数指示来读取用于解码编码的字节或码点的近似最大数量。解码器可以适当地修改该设置。默认值-1表示尽可能读取和解码。此参数旨在防止必须一步解码大文件。

FIRSTLINE标志表示,这将是足以只返回第一线,如果有对后世行解码错误。

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

readlinesize [keepends 
从输入流中读取一行并返回解码数据。

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

如果keepends为false,则会从返回的行中删除行结尾。

readlinessizehint [keepends 
读取输入流上的所有可用行并将其作为行列表返回。

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

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

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

请注意,不应进行流重新定位。该方法主要用于从解码错误中恢复。

除了上述方法之外,StreamReader还必须从基础流继承所有其他方法和属性。

 

StreamReaderWriter对象

StreamReaderWriter是一个便利类,它允许包装在读写模式下工作的流。

设计是这样的,可以使用函数返回的工厂 lookup()函数来构造实例。

class codecs.StreamReaderWriterstreamReaderWritererrors =’strict’ 
创建一个StreamReaderWriter实例。stream必须是类文件对象。ReaderWriter必须是工厂函数或提供StreamReaderStreamWriter接口的类 。错误处理的方式与为流读取器和编写器定义的方式相同。

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

 

StreamRecoder对象

StreamRecoder从一个编码到另一个,不同的编码处理的环境时,其有时是有用的转换数据。

设计是这样的,可以使用函数返回的工厂 lookup()函数来构造实例。

class codecs.StreamRecoderstreamencodedecodeReaderWritererrors =’strict’ 
创建StreamRecoder一个实现双向转换的实例: 编码解码工作,对前端-可见的代码调用数据read()write(),而读者作家 在后台工作-数据

您可以使用这些对象进行透明转码,例如Latin-1到UTF-8和返回。

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

编码解码参数必须坚持Codec接口。Reader和 Writer必须是工厂函数或分别提供StreamReaderStreamWriter接口对象的类 。

错误处理的方式与为流读取器和编写器定义的方式相同。

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

 

编码器

字符串在内部存储为范围内的代码点序列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)

还有另一组编码(所谓的charmap编码),它们选择所有Unicode代码点的不同子集以及这些代码点如何映射到字节0x0– 0xff。要查看如何完成此操作,只需打开eg 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-16或的字节序UTF-32字节序列,就是所谓的BOM(“字节顺序标记”)。这是Unicode字符 U+FEFF。此字符可以添加到每个UTF-16UTF-32 字节序列。此字符(0xFFFE)的字节交换版本是非法字符,可能不会出现在Unicode文本中。因此,当一个UTF-16UTF-32字节序列中的第一个字符看起来是一个U+FFFE字节时,必须在解码时交换字节。不幸的是,角色U+FEFF的第二个目的是:一个没有宽度且不允许分割单词的角色。它可以例如用于给结扎算法提供提示。使用Unicode 4.0 作为已弃用(使用(ZERO WIDTH NO-BREAK SPACEU+FEFFZERO WIDTH NO-BREAK SPACEU+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-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,并且解码后的字符串中的任何字符(即使它是第一个字符)都被视为a 。ZERO WIDTH NO-BREAK SPACE

没有外部信息,就不可能可靠地确定使用哪种编码来编码字符串。每个charmap编码可以解码任何随机字节序列。然而,UTF-8无法实现这一点,因为UTF-8字节序列的结构不允许任意字节序列。为了提高可以检测到UTF-8编码的可靠性,Microsoft "utf-8-sig"为其Notepad程序发明了一种UTF-8(Python 2.5调用)的变体 :在将任何Unicode字符写入文件之前,UTF-8编码BOM(它看起来像这样作为字节序列:0xef0xbb0xbf)被写入。因为任何charmap编码的文件都以这些字节值开始(例如映射到的)是相当不可能的

带有DIAERESIS的拉丁文小写字母
正确的双角度报价标记
倒置的问号

在iso-8859-1中,这增加了utf-8-sig从字节序列正确猜测编码的可能性。因此,BOM不用于确定用于生成字节序列的字节顺序,而是用作有助于猜测编码的签名。于编码的UTF-8-SIG的编解码器将写0xef0xbb0xbf如前三个字节到该文件。utf-8-sig如果它们作为文件中的前三个字节出现,则解码将跳过这三个字节。在UTF-8中,不鼓励使用BOM,一般应避免使用。

 

标准编码

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

CPython实现细节:一些常见的编码可以绕过编解码器查找机制来提高性能。这些优化机会仅被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中更改:为我们识别的优化机会-ascii。

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

  • ISO 8859代码集
  • Microsoft Windows代码页,通常派生自8859代码集,但用其他图形字符替换控制字符
  • IBM EBCDIC代码页
  • IBM PC代码页,与ASCII兼容
编解码器 别名 语言
ASCII 646,us-ascii 英语
中文 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 窗户-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_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 中文,csiso58gb231280,euc-cn,euccn,eucgb2312-cn,gb2312-1980,gb2312-80,iso-ir-58 简体中文
GBK 936,cp936,ms936 统一中文
GB18030 GB18030-2000 统一中文
赫兹 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,希腊语,greek8 希腊语
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 macgreek 希腊语
mac_iceland maciceland 冰岛的
mac_latin2 maclatin2,maccentraleurope 中欧和东欧
mac_roman 宏观,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 所有语言
utf_8_sig 所有语言

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

Python特定编码

许多预定义的编解码器特定于Python,因此它们的编解码器名称在Python之外没有任何意义。这些在下表中根据预期的输入和输出类型列出(请注意,虽然文本编码是编解码器的最常见用例,但底层编解码器基础结构支持任意数据转换,而不仅仅是文本编码)。对于非对称编解码器,所述目的描述了编码方向。

文字编码

以下编解码器提供strbytes编码和 类字节对象str解码,类似于Unicode文本编码。

编解码器 别名 目的
IDNA 器物 RFC 3490,另见 encodings.idna。仅errors='strict' 支持。
MBCS ansi,dbcs 仅限Windows:根据ANSI代码页(CP_ACP)编码操作数
OEM

仅限Windows:根据OEM代码页(CP_OEMCP)编码操作数

版本3.6中的新功能。

的PalmOS PalmOS 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

 

二进制变换

以下编解码器提供二进制转换:类似字节的对象 到bytes映射。它们不受支持bytes.decode() (仅产生str输出)。

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

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

版本3.4中更改:接受任何 类似字节的对象 作为编码和解码的输入

base64.encodebytes()

base64.decodebytes()

bz2_codec BZ2 使用bz2压缩操作数 bz2.compress() /

bz2.decompress()

hex_codec 十六进制 将操作数转换为十六进制表示,每个字节有两位数 binascii.b2a_hex() /

binascii.a2b_hex()

quopri_codec quopri,quotedprintable,quoted_printable 将操作数转换为MIME引用的可打印 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中更改:恢复二进制转换的别名。

 

文字转换

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

编解码器 别名 目的
rot_13 ROT13 返回操作数的Caesar-cypher加密

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

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

 

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

该模块实现 RFC 3490(应用程序中的国际化域名)和RFC 3492(Nameprep:国际化域名的Stringprep配置文件(IDN))。它建立在punycode编码和stringprep

这些RFC一起定义了一种协议,以支持域名中的非ASCII字符。包含非ASCII字符(例如www.Alliancefrançaise.nu)的域名 将转换为ASCII兼容编码(ACE,例如www.xn--alliancefranaise-npb.nu)。然后,域名的ACE形式将用于协议不允许任意字符的所有位置,例如DNS查询,HTTP 主机字段等。此转换在应用程序中执行; 如果可能对用户不可见:应用程序应透明地将Unicode域标签转换为线路上的IDNA,并在将ACE标签呈现给用户之前将其转换回Unicode标签。

Python以多种方式支持此转换:idna编解码器执行Unicode和ACE之间的转换,根据在中定义的分隔符将输入字符串分隔为标签RFC 3490的3.1节 ,并根据需要将每个标签转换为ACE,相反,根据.分隔符将输入字节串分离为标签,并将找到的任何ACE标签转换为unicode。此外,socket模块透明地将Unicode主机名转换为ACE,因此应用程序无需担心在将主机名传递给套接字模块时自行转换它们。最重要的是,具有主机名作为函数参数的模块(例如http.clientftplib)接受Unicode主机名(如果它根本发送该字段,http.client则还会在主机字段中透明地发送IDNA主机名 )。

从线路接收主机名时(例如在反向名称查找中),不会执行自动转换为Unicode:希望向用户显示此类主机名的应用程序应将它们解码为Unicode。

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

encodings.idna.nameprep标签
返回标签的nameprepped版本。该实现目前假定查询字符串,所以AllowUnassigned是真的。
encodings.idna.ToASCII标签
将标签转换为ASCII,如中所述 RFC 3490UseSTD3ASCIIRules被认为是假的。
encodings.idna.ToUnicode标签
将标签转换为Unicode,如中所述 RFC 3490

 

encodings.mbcs– Windows ANSI代码页

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

可用性:仅限Windows。

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

在版本3.2中更改:在3.2之前,忽略了errors参数; 'replace'总是习惯于编码和'ignore'解码。

 

encodings.utf_8_sig– 带BOM签名的UTF-8编解码器

该模块实现了UTF-8编解码器的变体:在编码时,UTF-8编码的BOM将被添加到UTF-8编码的字节之前。对于有状态编码器,这只做一次(在第一次写入字节流时)。对于解码,将跳过数据开头的可选UTF-8编码BOM。