二进制数据服务模块之codecs – 编解码器注册表和基类(19) – Python语言(必读进阶学习教程)(参考资料)
该模块定义了标准Python编解码器(编码器和解码器)的基类,并提供对内部Python编解码器注册表的访问,该注册表管理编解码器和错误处理查找过程。大多数标准编解码器是文本编码,它将文本编码为字节,但也提供了将文本编码为文本,将字节编码为字节的编解码器。自定义编解码器可以在任意类型之间进行编码和解码,但某些模块功能仅限于使用 文本编码或编码为的编解码器 bytes。
该模块定义了以下用于使用任何编解码器进行编码和解码的函数:
codecs.objencode(encoding=’utf-8′,errors=’strict’,)- 编码OBJ使用注册的编解码器编码。
可以给出错误以设置期望的错误处理方案。默认错误处理程序
'strict'意味着编码错误会增加ValueError(或者更多编解码器特定的子类,例如UnicodeEncodeError)。有关编解码器错误处理的更多信息,请参阅编解码器基类。
codecs.objdecode(encoding=’utf-8′,errors=’strict’,)- 解码OBJ使用注册的编解码器编码。
可以给出错误以设置期望的错误处理方案。默认错误处理程序
'strict'意味着解码错误会增加ValueError(或者更多编解码器特定的子类,例如UnicodeDecodeError)。有关编解码器错误处理的更多信息,请参阅编解码器基类。
每个编解码器的完整详细信息也可以直接查找:
codecs.encodinglookup()- 在Python编解码器注册表中查找编解码器信息,并返回
CodecInfo如下定义的 对象。首先在注册表的缓存中查找编码。如果未找到,则扫描已注册的搜索功能列表。如果没有
CodecInfo找到对象,LookupError则引发a。否则,该CodecInfo对象存储在缓存中并返回给调用者。
- class
codecs.encodeCodecInfo(decode,streamreader=None,streamwriter=None,incrementalencoder=None,incrementaldecoder=None,name=None,) - 查找编解码器注册表时的编解码器详细信息。构造函数参数存储在同名的属性中:
name- 编码的名称。
encodedecode- 无状态编码和解码功能。这些必须是与Codec实例
encode()和decode()方法具有相同接口的函数或方法(请参阅编解码器接口)。期望功能或方法在无状态模式下工作。
incrementalencoderincrementaldecoder- 增量编码器和解码器类或工厂功能。这些必须提供由所述基类定义的接口
IncrementalEncoder和IncrementalDecoder分别。增量编解码器可以维持状态。
streamwriterstreamreader- 流编写器和读取器类或工厂函数。这些必须提供由所述基类定义的接口
StreamWriter和StreamReader分别。流编解码器可以维护状态。
为了简化对各种编解码器组件的访问,该模块提供了lookup()用于编解码器查找的这些附加功能:
codecs.encodinggetencoder()- 查找给定编码的编解码器并返回其编码器功能。
LookupError如果找不到编码,则引发a 。
codecs.encodinggetdecoder()- 查找给定编码的编解码器并返回其解码器功能。
LookupError如果找不到编码,则引发a 。
codecs.encodinggetincrementalencoder()- 查找给定编码的编解码器并返回其增量编码器类或工厂函数。
LookupError如果无法找到编码或编解码器不支持增量编码器,则引发。
codecs.encodinggetincrementaldecoder()- 查找给定编码的编解码器并返回其增量解码器类或工厂函数。
LookupError如果无法找到编码或编解码器不支持增量解码器,则引发a 。
codecs.encodinggetreader()- 查找给定编码的编解码器并返回其
StreamReader类或工厂函数。LookupError如果找不到编码,则引发a 。
codecs.encodinggetwriter()- 查找给定编码的编解码器并返回其
StreamWriter类或工厂函数。LookupError如果找不到编码,则引发a 。
通过注册合适的编解码器搜索功能,可以使用自定义编解码器:
codecs.search_functionregister()- 注册编解码器搜索功能。搜索函数应该采用一个参数,即所有小写字母的编码名称,并返回一个
CodecInfo对象。如果搜索功能无法找到给定的编码,则应返回None。注意
搜索功能注册目前不可逆,这可能会在某些情况下导致问题,例如单元测试或模块重新加载。
虽然内置open()和相关io模块是使用编码文本文件的推荐方法,但此模块提供了额外的实用程序函数和类,允许在使用二进制文件时使用更广泛的编解码器:
codecs.filenameopen(mode=’r’,encoding=None,errors=’strict’,buffering=1,)- 使用给定模式打开编码文件并返回实例
StreamReaderWriter,提供透明编码/解码。默认文件模式是'r',意味着以读取模式打开文件。注意
底层编码文件始终以二进制模式打开。
'\n'在读写时不进行自动转换。所述模式参数可以是任何二进制模式可接受的内置open()功能; 的'b'自动添加。encoding指定用于文件的编码。允许编码和从字节解码的任何编码,文件方法支持的数据类型取决于所使用的编解码器。
可以给出错误来定义错误处理。默认情况下
'strict'会导致ValueError在发生编码错误时引发a 。缓冲具有与内置
open()函数相同的含义。它默认为行缓冲。
codecs.fileEncodedFile(data_encoding,file_encoding=None,errors=’strict’,)- 返回一个
StreamRecoder实例,一个 提供透明转码的文件的包装版本。关闭包装版本时,原始文件将关闭。写入包裹文件数据被根据给定的解码 data_encoding,然后写入到原来的文件作为字节使用 file_encoding。字节从原始文件读出是根据解码file_encoding,其结果是使用编码data_encoding。
如果file_encoding没有给出,则默认为data_encoding。
可以给出错误来定义错误处理。它默认为
'strict',导致ValueError在发生编码错误时引发。
codecs.iteratoriterencode(encoding,errors=’strict’,**kwargs,)- 使用增量编码器迭代编码迭代器提供的输入 。这个功能是一个发电机。的误差参数(以及任何其他关键字参数)通过以增量编码器通过。
此函数要求编解码器接受
str要编码的文本对象。因此它不支持字节到字节的编码器,例如base64_codec。
codecs.iteratoriterdecode(encoding,errors=’strict’,**kwargs,)- 使用增量解码器迭代解码迭代器提供的输入 。这个功能是一个发电机。的误差参数(以及任何其他关键字参数)通过以增量解码器通过。
此函数要求编解码器接受
bytes要解码的对象。因此,它不支持文本到文本编码器,例如rot_13,虽然rot_13可以等效地使用iterencode()。
该模块还提供以下常量,这些常量对于读取和写入平台相关文件非常有用:
codecs.BOMcodecs.BOM_BEcodecs.BOM_LEcodecs.BOM_UTF8codecs.BOM_UTF16codecs.BOM_UTF16_BEcodecs.BOM_UTF16_LEcodecs.BOM_UTF32codecs.BOM_UTF32_BEcodecs.BOM_UTF32_LE- 这些常量定义了各种字节序列,即几种编码的Unicode字节顺序标记(BOM)。它们在UTF-16和UTF-32数据流中用于指示使用的字节顺序,在UTF-8中用作Unicode签名。
BOM_UTF16是BOM_UTF16_BE或者BOM_UTF16_LE取决于平台的本机字节顺序,BOM是forBOM_UTF16,BOM_LEforBOM_UTF16_LE和BOM_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+DC80到U+DCFF。'surrogateescape'在编码数据时使用错误处理程序时,此代码将返回到相同的字节 。 |
此外,以下错误处理程序特定于给定的编解码器:
| 值 | 编解码器 | 含义 |
|---|---|---|
'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.nameregister_error(error_handler,)- 在名称名称下注册错误处理函数error_handler。该error_handler参数将编码和解码过程中的错误的情况下被调用,当名称被指定为误差参数。
对于编码,将使用 实例调用error_handler,该
UnicodeEncodeError实例包含有关错误位置的信息。错误处理程序必须引发此异常或异常,或者返回一个元组,其中包含输入的不可编码部分的替换以及编码应该继续的位置。替换可以是str或bytes。如果替换是字节,编码器将简单地将它们复制到输出缓冲区。如果替换是字符串,编码器将对替换进行编码。编码在指定位置的原始输入处继续。负位置值将被视为相对于输入字符串的结尾。如果结果位置超出界限,IndexError则会引发。解码和转换的工作方式类似,除了
UnicodeDecodeError或UnicodeTranslateError将被传递给处理程序,并且错误处理程序中的替换将直接放入输出中。
以前注册的错误处理程序(包括标准错误处理程序)可以通过名称查找:
codecs.namelookup_error()- 返回先前在名称名称下注册的错误处理程序。
LookupError如果找不到处理程序,则引发一个。
以下标准错误处理程序也可用作模块级功能:
codecs.exceptionstrict_errors()- 实现
'strict'错误处理:每个编码或解码错误都会引发错误UnicodeError。
codecs.exceptionreplace_errors()- 实现
'replace'错误处理(仅用于文本编码):替换'?'编码错误(由编解码器编码)和'\ufffd'(Unicode替换字符)用于解码错误。
codecs.exceptionignore_errors()- 实现
'ignore'错误处理:忽略格式错误的数据,并继续编码或解码,恕不另行通知。
codecs.exceptionxmlcharrefreplace_errors()- 实现
'xmlcharrefreplace'错误处理(仅用于使用 文本编码进行编码):将不可编码的字符替换为适当的XML字符引用。
codecs.exceptionbackslashreplace_errors()- 实现
'backslashreplace'错误处理(仅适用于 文本编码):格式错误的数据由反斜杠转义序列替换。
codecs.exceptionnamereplace_errors()- 实现
'namereplace'错误处理(仅用于使用 文本编码进行编码):将不可编码的字符替换为\N{...}转义序列。版本3.5中的新功能。
无状态编码和解码
基Codec类定义了这些方法,它们还定义了无状态编码器和解码器的功能接口:
Codec.inputencode(errors[,])- 对对象输入进行编码并返回元组(输出对象,消耗的长度)。例如,文本编码使用特定字符集编码(例如,
cp1252或iso-8859-1)将字符串对象转换为字节对象。该错误参数定义错误处理申请。它默认为
'strict'处理。该方法可能不会在
Codec实例中存储状态。使用StreamWriter了其必须保持状态,以便使编码效率的编解码器。在这种情况下,编码器必须能够处理零长度输入并返回输出对象类型的空对象。
Codec.inputdecode(errors[,])- 解码对象输入并返回元组(输出对象,消耗的长度)。例如,对于文本编码,解码将使用特定字符集编码编码的字节对象转换为字符串对象。
对于文本编码和字节到字节编解码器, 输入必须是字节对象或提供只读缓冲区接口的对象 – 例如,缓冲区对象和内存映射文件。
该错误参数定义错误处理申请。它默认为
'strict'处理。该方法可能不会在
Codec实例中存储状态。使用StreamReader了其必须保持状态,以便使解码效率的编解码器。解码器必须能够处理零长度输入并在这种情况下返回输出对象类型的空对象。
增量编码和解码
的IncrementalEncoder和IncrementalDecoder类提供了增量编码和解码的基本接口。对一个无状态编码器/解码器功能的调用不是对输入进行编码/解码,而是对增量编码器/解码器的encode()/ decode()方法进行多次调用 。增量编码器/解码器在方法调用期间跟踪编码/解码过程。
对encode()/ decode()method 的调用的连接输出与将 所有单个输入连接成一个输入相同,并且该输入使用无状态编码器/解码器进行编码/解码。
IncrementalEncoder对象
的IncrementalEncoder类是用于在多个步骤中编码的输入。它定义了以下方法,每个增量编码器必须定义这些方法才能与Python编解码器注册表兼容。
- class
codecs.errors=’strict’IncrementalEncoder() IncrementalEncoder实例的构造函数。所有增量编码器都必须提供此构造函数接口。他们可以自由添加其他关键字参数,但Python编解码器注册表只使用此处定义的参数。
该
IncrementalEncoder可以通过提供实现不同的错误处理方案的错误关键字参数。有关可能的值,请参见错误处理程序该错误参数将被分配到相同名称的属性。分配给此属性可以在
IncrementalEncoder对象的生命周期内切换不同的错误处理策略。objectencode(final[,])- 编码对象(考虑编码器的当前状态)并返回结果编码对象。如果这是对final的最后一次调用 必须为true(默认为false)。
encode()
reset()- 将编码器重置为初始状态。输出被丢弃:调用 ,必要时传递空字节或文本字符串,以重置编码器并获得输出。
.encode(object, final=True)
getstate()- 返回编码器的当前状态,该状态必须是整数。实施应该确保这
0是最常见的状态。(比整数更复杂的状态可以通过编组/选择状态并将结果字符串的字节编码为整数来转换为整数)。
statesetstate()- 将编码器的状态设置为state。state必须是返回的编码器状态
getstate()。
IncrementalDecoder对象
的IncrementalDecoder类是用于在多个步骤中进行解码的输入。它定义了以下方法,每个增量解码器必须定义这些方法才能与Python编解码器注册表兼容。
- class
codecs.errors=’strict’IncrementalDecoder() IncrementalDecoder实例的构造函数。所有增量解码器都必须提供此构造函数接口。他们可以自由添加其他关键字参数,但Python编解码器注册表只使用此处定义的参数。
该
IncrementalDecoder可以通过提供实现不同的错误处理方案的错误关键字参数。有关可能的值,请参见错误处理程序该错误参数将被分配到相同名称的属性。分配给此属性可以在
IncrementalDecoder对象的生命周期内切换不同的错误处理策略。objectdecode(final[,])- 解码对象(考虑解码器的当前状态)并返回结果解码对象。 如果这是最后一次调用 decode() final 必须为真(默认为假)。 如果 final 为真,则解码器必须完全解码输入并且必须刷新所有缓冲区。 如果这是不可能的(例如,由于输入末尾的字节序列不完整),它必须像在无状态情况下一样启动错误处理(这可能会引发异常)。
reset()- 将解码器重置为初始状态。
getstate()- 返回解码器的当前状态。这必须是包含两个项的元组,第一个必须是包含仍然未解码的输入的缓冲区。第二个必须是整数,可以是其他状态信息。(实现应该确保这
0是最常见的附加状态信息。)如果这个额外的状态信息是0必须可以将解码器设置为没有输入缓冲0的状态和 作为附加状态信息,以便以前提供缓冲输入到解码器将其返回到先前的状态而不产生任何输出。(通过编组/选取信息并将结果字符串的字节编码为整数,可以将比整数更复杂的附加状态信息转换为整数。)
statesetstate()- 将编码器的状态设置为state。state必须是返回的解码器状态
getstate()。
流编码和解码
在StreamWriter和StreamReader类提供可用于非常容易地实现新的编码子模块的通用的工作界面。请参阅有关encodings.utf_8如何完成此操作的示例。
StreamWriter对象
StreamWriter 和 StreamReader 类提供了通用的工作接口,可以很容易地用于实现新的编码子模块。 有关如何完成此操作的示例,请参见 encodings.utf_8。
- class
codecs.streamStreamWriter(errors=’strict’,) StreamWriter实例的构造函数。所有流编写器都必须提供此构造函数接口。他们可以自由添加其他关键字参数,但Python编解码器注册表只使用此处定义的参数。
该流参数必须是一个类似文件的对象打开用于写入文本或二进制数据,以适合特定的编解码器。
该
StreamWriter可以通过提供实现不同的错误处理方案的错误关键字参数。请参见错误处理程序的标准错误处理的基本流编解码器可支持。该错误参数将被分配到相同名称的属性。分配给此属性可以在
StreamWriter对象的生命周期内切换不同的错误处理策略。objectwrite()- 将对象的内容编码写入流。
listwritelines()- 将串联的字符串列表写入流(可能通过重用该
write()方法)。标准的字节到字节编解码器不支持此方法。
reset()- 刷新并重置用于保持状态的编解码器缓冲区。
调用此方法应确保输出上的数据处于干净状态,允许附加新的新数据,而无需重新扫描整个流以恢复状态。
除了上述方法之外,StreamWriter还必须从基础流继承所有其他方法和属性。
StreamReader对象
StreamReader 类是 Codec 的子类,它定义了每个流读取器必须定义的以下方法,以便与 Python 编解码器注册表兼容。
- class
codecs.streamStreamReader(errors=’strict’,) StreamReader实例的构造函数。所有流读取器都必须提供此构造函数接口。他们可以自由添加其他关键字参数,但Python编解码器注册表只使用此处定义的参数。
的流参数必须是一个类文件对象开放阅读文本或二进制数据,以适合特定的编解码器。
该
StreamReader可以通过提供实现不同的错误处理方案的错误关键字参数。请参见错误处理程序的标准错误处理的基本流编解码器可支持。该错误参数将被分配到相同名称的属性。分配给此属性可以在
StreamReader对象的生命周期内切换不同的错误处理策略。可以使用扩展errors参数 的允许值集
register_error()。sizeread([chars[,firstline[,]]])- 解码流中的数据并返回结果对象。
该字符参数指示解码码点或字节返回的数量。该
read()方法永远不会返回比请求数据更多的数据,但如果没有足够的可用数据,它可能会返回更少的数据。所述尺寸参数指示来读取用于解码编码的字节或码点的近似最大数量。解码器可以适当地修改该设置。默认值-1表示尽可能读取和解码。此参数旨在防止必须一步解码大文件。
该FIRSTLINE标志表示,这将是足以只返回第一线,如果有对后世行解码错误。
该方法应该使用贪婪的读取策略,这意味着它应该读取编码定义和给定大小内允许的数据,例如,如果流上有可选的编码结尾或状态标记,则也应该读取这些数据。
sizereadline([keepends[,]])- 从输入流中读取一行并返回解码数据。
size,如果给定,则作为size参数传递给stream的
read()方法。如果keepends为false,则会从返回的行中删除行结尾。
sizehintreadlines([keepends[,]])- 读取输入流上的所有可用行并将其作为行列表返回。
行尾使用编解码器的解码器方法实现,如果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对象
StreamReaderWriter 是一个便利类,它允许包装在读写模式下工作的流。
这种设计使得人们可以使用 lookup() 函数返回的工厂函数来构造实例。
- class
codecs.streamStreamRecoder(Reader,Writer,errors=’strict’,) - 创建
StreamRecoder一个实现双向转换的实例: 编码和解码工作,对前端-可见的代码调用数据read()和write(),而读者和作家 在后台工作-数据流。您可以使用这些对象进行透明转码,例如Latin-1到UTF-8和返回。
该流参数必须是一个类似文件的对象。
该编码和解码参数必须坚持
Codec接口。Reader和 Writer必须是工厂函数或分别提供StreamReader和StreamWriter接口对象的类 。错误处理的方式与为流读取器和编写器定义的方式相同。
StreamRecoder实例定义StreamReader和StreamWriter类的组合接口 。它们从基础流继承所有其他方法和属性。
编码器
字符串在内部存储为范围内的代码点序列0x0– 0x10FFFF。一旦在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-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的第二个目的是:一个没有宽度且不允许分割单词的角色。它可以例如用于给结扎算法提供提示。使用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(它看起来像这样作为字节序列:0xef,0xbb,0xbf)被写入。因为任何charmap编码的文件都以这些字节值开始(例如映射到的)是相当不可能的
带有DIAERESIS的拉丁文小写字母正确的双角度报价标记倒置的问号
在iso-8859-1中,这增加了utf-8-sig从字节序列正确猜测编码的可能性。因此,BOM不用于确定用于生成字节序列的字节顺序,而是用作有助于猜测编码的签名。于编码的UTF-8-SIG的编解码器将写0xef,0xbb,0xbf如前三个字节到该文件。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( 版本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 | 统一中文 |
| 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,希腊语,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 | 东南欧 |
| johab | 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之外没有任何意义。这些在下表中根据预期的输入和输出类型列出(请注意,虽然文本编码是编解码器的最常见用例,但底层编解码器基础结构支持任意数据转换,而不仅仅是文本编码)。对于非对称编解码器,所述目的描述了编码方向。
文字编码
以下编解码器提供str到bytes编码和 类字节对象到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开始不推荐使用:此表示已被废弃。 |
二进制变换
以下编解码器提供二进制转换:类似字节的对象 到bytes映射。它们不受支持bytes.decode() (仅产生str输出)。
| 编解码器 | 别名 | 目的 | 编码器/解码器 |
|---|---|---|---|
| base64_codec [1] | base64,base_64 |
将操作数转换为多行MIME base64(结果始终包含尾随 版本3.4中更改:接受任何 类似字节的对象 作为编码和解码的输入 |
base64.encodebytes()
|
| bz2_codec | BZ2 | 使用bz2压缩操作数 | bz2.compress() /
|
| hex_codec | 十六进制 | 将操作数转换为十六进制表示,每个字节有两位数 | binascii.b2a_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 str到str 映射。它不受支持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.client和ftplib)接受Unicode主机名(如果它根本发送该字段,http.client则还会在主机字段中透明地发送IDNA主机名 )。
从线路接收主机名时(例如在反向名称查找中),不会执行自动转换为Unicode:希望向用户显示此类主机名的应用程序应将它们解码为Unicode。
该模块encodings.idna还实现了nameprep过程,该过程对主机名执行某些规范化,以实现国际域名的不区分大小写,并统一相似的字符。如果需要,可以直接使用nameprep函数。
encodings.idna.nameprep(标签)- 返回标签的nameprepped版本。该实现目前假定查询字符串,所以
AllowUnassigned是真的。
encodings.idna.ToASCII(标签)- 将标签转换为ASCII,如中所述 RFC 3490。
UseSTD3ASCIIRules被认为是假的。
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。