codecs
---编解码器注册表和基类¶
源代码: Lib/codecs.py
此模块定义标准python编解码器(编码器和解码器)的基类,并提供对内部python编解码器注册表的访问,该注册表管理编解码器和错误处理查找过程。大多数标准编解码器是 text encodings 它将文本编码为字节,但也提供了将文本编码为文本和字节编码为字节的编解码器。自定义编解码器可以在任意类型之间进行编码和解码,但某些模块功能被限制为专门用于 text encodings 或者使用编码到 bytes
.
该模块定义了以下函数,用于使用任何编解码器进行编码和解码:
- codecs.encode(obj, encoding='utf-8', errors='strict')¶
编码 obj 使用注册的编解码器 encoding .
errors 可以设置所需的错误处理方案。默认错误处理程序是
'strict'
意味着编码错误会导致ValueError
(或更特定于编解码器的子类,如UnicodeEncodeError
)参照 编解码器基类 有关编解码器错误处理的详细信息。
- codecs.decode(obj, encoding='utf-8', errors='strict')¶
译码 obj 使用注册的编解码器 encoding .
errors 可以设置所需的错误处理方案。默认错误处理程序是
'strict'
意味着解码错误会导致ValueError
(或更特定于编解码器的子类,如UnicodeDecodeError
)参照 编解码器基类 有关编解码器错误处理的详细信息。
还可以直接查找每个编解码器的完整详细信息:
- codecs.lookup(encoding)¶
在python codec注册表中查找codec信息并返回
CodecInfo
对象定义如下。编码首先在注册表的缓存中查找。如果未找到,则扫描已注册搜索功能的列表。如果没有
CodecInfo
找到对象,aLookupError
提高了。否则,CodecInfo
对象存储在缓存中并返回给调用方。
- class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)¶
查找编解码器注册表时编解码器详细信息。构造函数参数存储在相同名称的属性中:
- name¶
编码的名称。
- encode¶
- decode¶
无状态编码和解码功能。这些函数或方法必须与
encode()
和decode()
编解码器实例的方法(请参见 Codec Interface )函数或方法应在无状态模式下工作。
- incrementalencoder¶
- incrementaldecoder¶
增量编码器和解码器类或factory函数。这些必须提供由基类定义的接口
IncrementalEncoder
和IncrementalDecoder
,分别。增量编解码器可以保持状态。
- streamwriter¶
- streamreader¶
流编写器和读卡器类或factory函数。这些必须提供由基类定义的接口
StreamWriter
和StreamReader
,分别。流编解码器可以保持状态。
为了简化对各种编解码器组件的访问,模块提供了使用 lookup()
对于编解码器查找:
- codecs.getencoder(encoding)¶
查找给定编码的编解码器并返回其编码器函数。
提出一个
LookupError
如果找不到编码。
- codecs.getdecoder(encoding)¶
查找给定编码的编解码器并返回其解码器功能。
提出一个
LookupError
如果找不到编码。
- codecs.getincrementalencoder(encoding)¶
查找给定编码的编解码器并返回其增量编码器类或factory函数。
提出一个
LookupError
如果找不到编码或编解码器不支持增量编码器。
- codecs.getincrementaldecoder(encoding)¶
查找给定编码的编解码器并返回其增量解码器类或factory函数。
提出一个
LookupError
如果找不到编码或编解码器不支持增量解码器。
- codecs.getreader(encoding)¶
查找给定编码的编解码器并返回其
StreamReader
类或factory函数。提出一个
LookupError
如果找不到编码。
- codecs.getwriter(encoding)¶
查找给定编码的编解码器并返回其
StreamWriter
类或factory函数。提出一个
LookupError
如果找不到编码。
通过注册合适的编解码器搜索功能,可以使用自定义编解码器:
- codecs.register(search_function)¶
注册编解码器搜索函数。搜索函数应采用一个参数,即所有小写字母的编码名称,并返回
CodecInfo
对象。如果搜索函数找不到给定的编码,它应该返回None
.
- codecs.unregister(search_function)¶
注销编解码器搜索函数并清除注册表的缓存。如果搜索功能未注册,则不执行任何操作。
3.10 新版功能.
当内置 open()
以及 io
模块是处理编码文本文件的推荐方法,此模块提供了额外的实用程序函数和类,允许在处理二进制文件时使用更广泛的编解码器:
- codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=- 1)¶
使用给定的 mode 并返回
StreamReaderWriter
提供透明的编码/解码。默认文件模式为'r'
,表示以读取模式打开文件。注解
底层编码文件总是以二进制模式打开。无自动转换
'\n'
是在阅读和写作上完成的。这个 mode 参数可以是内置可接受的任何二进制模式open()
功能;'b'
自动添加。encoding 指定要用于文件的编码。允许对字节进行编码和解码的任何编码,文件方法支持的数据类型取决于使用的编解码器。
errors 可用于定义错误处理。它默认为
'strict'
导致一个ValueError
在发生编码错误时引发。缓冲 与内置的含义相同
open()
功能。它默认为-1,这意味着将使用默认缓冲区大小。
- codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')¶
返回A
StreamRecoder
实例,封装版本 file 它提供透明的转码。当封装版本关闭时,原始文件将关闭。写入打包文件的数据将根据给定的 data_encoding 然后用字节写入原始文件 file_encoding . 从原始文件读取的字节根据 file_encoding ,结果使用 data_encoding .
如果 file_encoding 未给定,默认为 data_encoding .
errors 可用于定义错误处理。它默认为
'strict'
引起ValueError
在发生编码错误时引发。
- codecs.iterencode(iterator, encoding, errors='strict', **kwargs)¶
使用增量编码器对由提供的输入进行迭代编码 迭代器 . 此函数是 generator . 这个 errors 参数(以及任何其他关键字参数)传递给增量编码器。
此函数要求编解码器接受文本
str
要编码的对象。因此,它不支持字节到字节的编码器,例如base64_codec
.
- codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)¶
使用增量解码器迭代解码 迭代器 . 此函数是 generator . 这个 errors 参数(以及任何其他关键字参数)传递给增量解码器。
此函数要求编解码器接受
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
是一个别名BOM_UTF16
,BOM_LE
对于BOM_UTF16_LE
和BOM_BE
对于BOM_UTF16_BE
. 其他的则用utf-8和utf-32编码表示BOM。
编解码器基类¶
这个 codecs
模块定义了一组基本类,这些基本类定义了用于处理编解码器对象的接口,还可以用作自定义编解码器实现的基础。
每个编解码器必须定义四个接口,使其在Python中可用作编解码器:无状态编码器、无状态解码器、流阅读器和流编写器。流阅读器和编写器通常重用无状态编码器/解码器来实现文件协议。编解码器作者还需要定义编解码器如何处理编码和解码错误。
错误处理程序¶
为了简化和标准化错误处理,编解码器可以通过接受 错误 字符串参数。以下字符串值由所有标准Python编解码器定义和实现:
价值 |
意义 |
---|---|
|
提高 |
|
忽略格式错误的数据,然后继续而不另行通知。实施于 |
以下错误处理程序仅适用于 text encodings :
价值 |
意义 |
---|---|
|
替换为合适的替换标记;python将使用 |
|
替换为适当的XML字符引用(仅用于编码)。实施于 |
|
替换为反斜杠转义序列。在实施 |
|
替换为 |
|
在解码时,用单个代理代码替换字节,范围为 |
此外,以下错误处理程序特定于给定的编解码器:
价值 |
编解码器 |
意义 |
---|---|---|
|
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)¶
注册错误处理函数 error_handler 名下 name . 这个 error_handler 在编码和解码过程中,如果出现错误,将调用参数,当 name 被指定为错误参数。
用于编码, error_handler 将使用
UnicodeEncodeError
实例,其中包含有关错误位置的信息。错误处理程序必须引发此异常或其他异常,或者返回一个元组,替换输入的不可编码部分和继续编码的位置。替换可以是str
或bytes
. 如果替换为字节,编码器只需将它们复制到输出缓冲区中。如果替换是字符串,编码器将对替换进行编码。在指定位置对原始输入继续编码。负位置值将被视为相对于输入字符串的结尾。如果结果位置超出限制IndexError
将被提升。译码和翻译工作类似,除了
UnicodeDecodeError
或UnicodeTranslateError
将传递给处理程序,并且来自错误处理程序的替换将直接放入输出。
可以按名称查找以前注册的错误处理程序(包括标准错误处理程序):
- codecs.lookup_error(name)¶
返回以前在名称下注册的错误处理程序 name .
提出一个
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 新版功能.
无状态编码和解码¶
底座 Codec
类定义这些方法,这些方法还定义无状态编码器和解码器的函数接口:
- Codec.encode(input[, errors])¶
对对象进行编码 input 并返回一个元组(输出对象,使用的长度)。例如, text encoding 使用特定的字符集编码(例如,
cp1252
或iso-8859-1
)这个 errors 参数定义要应用的错误处理。它默认为
'strict'
处理。方法不能将状态存储在
Codec
实例。使用StreamWriter
对于必须保持状态以提高编码效率的编解码器。编码器必须能够处理零长度输入,并在这种情况下返回输出对象类型的空对象。
- Codec.decode(input[, errors])¶
解码对象 输入 并返回一个元组(输出对象,消耗的长度)。例如,对于 text encoding ,解码将使用特定字符集编码的bytes对象转换为字符串对象。
对于文本编码和字节到字节编解码器, input 必须是字节对象或提供只读缓冲区接口的对象,例如缓冲区对象和内存映射文件。
这个 errors 参数定义要应用的错误处理。它默认为
'strict'
处理。方法不能将状态存储在
Codec
实例。使用StreamReader
对于必须保持状态以提高解码效率的编解码器。在此情况下,解码器必须能够处理零长度输入并返回输出对象类型的空对象。
增量编码和解码¶
这个 IncrementalEncoder
and IncrementalDecoder
classes provide the basic interface for incremental encoding and decoding. Encoding/decoding the input isn't done with one call to the stateless encoder/decoder function, but with multiple calls to the encode()
/decode()
增量编码器/解码器的方法。增量编码器/解码器在方法调用期间跟踪编码/解码过程。
调用的联合输出 encode()
/decode()
方法与将所有单个输入合并为一个输入相同,并且使用无状态编码器/解码器对该输入进行编码/解码。
递增编码器对象¶
这个 IncrementalEncoder
类用于对多个步骤中的输入进行编码。它定义了每个增量编码器必须定义的以下方法,以便与Python编解码器注册表兼容。
- class codecs.IncrementalEncoder(errors='strict')¶
的构造函数
IncrementalEncoder
实例。所有增量编码器都必须提供此构造函数接口。它们可以自由地添加其他关键字参数,但这里定义的参数只能由python codec注册表使用。
这个
IncrementalEncoder
可以通过提供 errors 关键字参数。见 错误处理程序 对于可能的值。这个 errors 参数将分配给同名的属性。分配给该属性可以在
IncrementalEncoder
对象。- reset()¶
将编码器重置为初始状态。输出被丢弃:调用
.encode(object, final=True)
,根据需要传递空字节或文本字符串以重置编码器并获取输出。
- getstate()¶
返回编码器的当前状态,该状态必须为整数。实现应该确保
0
是最常见的状态。(比整数复杂的状态可以通过封送/选取状态并将结果字符串的字节编码为整数来转换为整数。)
- setstate(state)¶
将编码器的状态设置为 state . state 必须是由返回的编码器状态
getstate()
.
IncrementalDecoder对象¶
这个 IncrementalDecoder
类用于对多个步骤中的输入进行解码。它定义了每个增量解码器必须定义的以下方法,以便与Python编解码器注册表兼容。
- class codecs.IncrementalDecoder(errors='strict')¶
的构造函数
IncrementalDecoder
实例。所有增量解码器都必须提供此构造函数接口。它们可以自由地添加其他关键字参数,但这里定义的参数只能由python codec注册表使用。
这个
IncrementalDecoder
可以通过提供 errors 关键字参数。见 错误处理程序 对于可能的值。这个 errors 参数将分配给同名的属性。分配给该属性可以在
IncrementalDecoder
对象。- decode(object[, final])¶
译码 object (考虑解码器的当前状态)并返回结果解码对象。如果这是最后一个调用
decode()
最终的 必须为真(默认值为假)。如果 最终的 为真,解码器必须完全解码输入,并且必须刷新所有缓冲区。如果这是不可能的(例如,由于输入末尾的字节序列不完整),它必须像在无状态情况下那样启动错误处理(这可能会引发异常)。
- reset()¶
将解码器重置为初始状态。
- getstate()¶
返回解码器的当前状态。这必须是一个包含两个项的元组,第一个必须是包含仍然未编码的输入的缓冲区。第二个必须是整数,并且可以是其他状态信息。(实施应确保
0
是最常见的附加状态信息。)如果此附加状态信息是0
必须能够将解码器设置为没有输入缓冲的状态,并且0
作为附加的状态信息,以便将先前缓冲的输入提供给解码器将其返回到先前的状态,而不产生任何输出。(通过封送/提取信息并将结果字符串的字节编码为整数,可以将比整数复杂的其他状态信息转换为整数。)
- setstate(state)¶
状态 . 状态 必须是由返回的解码器状态
getstate()
.
流编码和解码¶
这个 StreamWriter
和 StreamReader
类提供了通用的工作接口,可以很容易地用来实现新的编码子模块。见 encodings.utf_8
举个例子来说明这是如何做到的。
StreamWriter对象¶
这个 StreamWriter
类是的子类 Codec
并定义每个流编写器必须定义的以下方法,以便与Python编解码器注册表兼容。
- class codecs.StreamWriter(stream, errors='strict')¶
的构造函数
StreamWriter
实例。所有流编写器都必须提供此构造函数接口。它们可以自由地添加其他关键字参数,但这里定义的参数只能由python codec注册表使用。
这个 流动 参数必须是为写入文本或二进制数据而打开的类似文件的对象,具体取决于特定的编解码器。
这个
StreamWriter
可以通过提供 errors 关键字参数。见 错误处理程序 对于标准错误处理程序,底层流编解码器可能支持。这个 errors 参数将分配给同名的属性。分配给该属性可以在
StreamWriter
对象。- write(object)¶
将对象的内容编码到流中。
- reset()¶
重置用于保持内部状态的编解码器缓冲区。
调用此方法应确保输出上的数据处于干净状态,允许附加新的新数据,而无需重新扫描整个流以恢复状态。
除上述方法外, StreamWriter
还必须从基础流继承所有其他方法和属性。
StreamReader对象¶
这个 StreamReader
类是的子类 Codec
并定义以下方法,每个流读取器都必须定义这些方法,以便与Python编解码器注册表兼容。
- class codecs.StreamReader(stream, errors='strict')¶
的构造函数
StreamReader
实例。所有流读取器都必须提供此构造函数接口。它们可以自由地添加其他关键字参数,但这里定义的参数只能由python codec注册表使用。
这个 流动 参数必须是为读取文本或二进制数据而打开的类似于文件的对象,具体取决于特定的编解码器。
这个
StreamReader
可以通过提供 errors 关键字参数。见 错误处理程序 对于标准错误处理程序,底层流编解码器可能支持。这个 errors 参数将分配给同名的属性。分配给该属性可以在
StreamReader
对象。的允许值集 errors 参数可以扩展为
register_error()
.- read([size[, chars[, firstline]]])¶
从流中解码数据并返回结果对象。
这个 字符 参数指示要返回的解码代码点或字节数。这个
read()
方法将永远不会返回比请求的更多的数据,但如果没有足够的可用性,则返回的数据可能会更少。这个 size 参数指示解码时要读取的编码字节或代码点的近似最大数目。解码器可以根据需要修改此设置。默认值-1表示尽可能多地读取和解码。此参数旨在防止一步解码大量文件。
这个 第一行 标志表示如果后面的行有解码错误,只返回第一行就足够了。
该方法应该使用贪婪的读取策略,这意味着它应该读取编码定义和给定大小中允许的尽可能多的数据,例如,如果流上有可选的编码结尾或状态标记,则也应该读取这些数据。
- readline([size[, keepends]])¶
从输入流中读取一行并返回解码后的数据。
size 如果给定,则作为大小参数传递给流的
read()
方法。如果 守护者 将从返回的行中删除是否为假行尾。
- readlines([sizehint[, keepends]])¶
读取输入流上可用的所有行,并将它们作为行列表返回。
行尾是使用编解码器的
decode()
方法和包含在列表项中,如果 守护者 是真的。西辛 如果给出,则作为 size 流的参数
read()
方法。
- reset()¶
重置用于保持内部状态的编解码器缓冲区。
请注意,不应重新定位流。这种方法的主要目的是能够从解码错误中恢复。
除上述方法外, StreamReader
还必须从基础流继承所有其他方法和属性。
StreamReaderWriter对象¶
这个 StreamReaderWriter
是一个方便的类,它允许封装在读写模式下工作的流。
这种设计可以使用 lookup()
函数来构造实例。
- class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict')¶
创建一个
StreamReaderWriter
实例。 流动 必须是类似文件的对象。*reader*和*writer*必须是提供StreamReader
和StreamWriter
接口响应错误处理的方式与为流读写器定义的方式相同。
StreamReaderWriter
实例定义的组合接口 StreamReader
和 StreamWriter
类。它们从基础流继承所有其他方法和属性。
流重新编码对象¶
这个 StreamRecoder
将数据从一种编码转换为另一种编码,这在处理不同的编码环境时有时很有用。
这种设计可以使用 lookup()
函数来构造实例。
- class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict')¶
创建一个
StreamRecoder
实现双向转换的实例: encoding 和 decode 在前端工作-代码调用可见的数据read()
和write()
,同时*reader*和*writer*在后端工作-中的数据 流动 .您可以使用这些对象来执行透明的代码转换,例如,从Latin-1到UTF-8再到back。
这个 流动 参数必须是类似文件的对象。
这个 encoding 和 decode 参数必须符合
Codec
接口。*reader*和*writer*必须是提供对象的factory函数或类StreamReader
和StreamWriter
接口。错误处理的方式与为流读写器定义的方式相同。
StreamRecoder
实例定义的组合接口 StreamReader
和 StreamWriter
类。它们从基础流继承所有其他方法和属性。
编码和Unicode¶
字符串在内部存储为范围内的代码点序列 0x0
--0x10FFFF
。(见 PEP 393 有关实现的更多细节。)一旦在CPU和内存之外使用字符串对象,endianness以及如何将这些数组存储为字节就成了一个问题。与其他编解码器一样,将字符串序列化为字节序列称为 编码 ,从字节序列重新创建字符串称为 译码 . 有各种不同的文本序列化编解码器,这些编解码器统称为 text encodings .
最简单的文本编码(称为 '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’。要了解这是如何完成的,只需打开例如 encodings/cp1252.py
(主要在Windows上使用的编码)。有一个包含256个字符的字符串常量,它向您显示将哪个字符映射到哪个字节值。
所有这些编码只能编码用Unicode定义的1114112个码位中的256个。可以存储每个Unicode代码点的一种简单而直接的方法是将每个代码点存储为四个连续的字节。有两种可能:按big-endian或little-endian顺序存储字节。这两个编码叫做 UTF-32-BE
和 UTF-32-LE
分别。他们的缺点是如果你使用 UTF-32-BE
在一个小的endian机器上,在编码和解码时总是需要交换字节。 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
有第二个目的 ZERO WIDTH NO-BREAK SPACE
:没有宽度且不允许拆分单词的字符。例如,它可以用来提示结扎算法。使用Unicode 4.0 U+FEFF
作为一个 ZERO WIDTH NO-BREAK SPACE
已弃用(与 U+2060
(WORD JOINER
)承担这个角色)。然而,Unicode软件仍然必须能够处理 U+FEFF
在这两个角色中:作为一个BOM,它是一个确定编码字节的存储布局的设备,一旦字节序列被解码成字符串,它就会消失;作为一个 ZERO WIDTH NO-BREAK SPACE
它是一个普通的字符,可以像其他任何字符一样被解码。
还有另一种编码可以对整个Unicode字符范围进行编码:UTF-8。UTF-8是一种8位编码,这意味着在UTF-8中字节顺序没有问题。UTF-8字节序列中的每个字节由两部分组成:标记位(最高有效位)和有效载荷位。标记位是从0到4的序列。 1
位后跟a 0
比特。unicode字符的编码方式如下(x是有效负载位,当连接时,将给出unicode字符):
范围 |
编码 |
---|---|
|
0xXXXXXX |
|
110xxxxx万 |
|
1110XXXX万XXXX万XXXX |
|
11110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
Unicode字符的最低有效位是最右边的X位。
由于UTF-8是8位编码,因此不需要任何BOM和任何 U+FEFF
解码字符串中的字符(即使是第一个字符)被视为 ZERO WIDTH NO-BREAK SPACE
.
如果没有外部信息,就无法可靠地确定用于编码字符串的编码方式。每个charmap编码都可以解码任意随机字节序列。但是,使用UTF-8是不可能的,因为UTF-8字节序列的结构不允许任意字节序列。为了提高检测utf-8编码的可靠性,微软发明了一种utf-8的变体(python 2.5调用 "utf-8-sig"
)对于它的记事本程序:在将任何Unicode字符写入文件之前,一个UTF-8编码的BOM(它看起来像一个字节序列: 0xef
, 0xbb
, 0xbf
是书面的。因为任何charmap编码的文件都不可能以这些字节值开头(例如映射到
带分音符的拉丁文小写字母I右指双尖引号倒问号
在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 implementation detail: 一些常见的编码可以绕过编解码器查找机制来提高性能。这些优化机会只能由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认可的优化机会。
许多字符集支持相同的语言。它们在单个字符(例如,是否支持欧元符号)以及将字符分配到代码位置方面有所不同。尤其是对于欧洲语言,通常存在以下变体:
ISO 8859代码集
Microsoft Windows代码页,通常从8859代码集派生,但将控制字符替换为其他图形字符。
IBM EBCDIC代码页
IBM PC代码页,与ASCII兼容
编解码器 |
别名 |
语言文字 |
---|---|---|
ASCII码 |
646,美国ASCII |
英语 |
Big5 |
Big5TW,CSBIG5 |
繁体中文 |
Big5hksc公司 |
Big5香港证券交易所、香港证券交易所 |
繁体中文 |
CP037 |
iBM037 |
英语 |
CP27 3 |
273、IBM273、CSIBM273 |
德国的 3.4 新版功能. |
CP424 |
EBCDIC-CP-HE,IBM424 |
希伯来语 |
CP437 |
437,IBM M437 |
英语 |
CP500 |
EBCDIC-CP-BE、EBCDIC-CP-CH、IBM500 |
西欧 |
CP720 |
阿拉伯语的 |
|
CP737 |
希腊人 |
|
CP775 |
IBM 775 |
波罗的语族 |
CP850 |
850,IBM 850 |
西欧 |
CP852 |
852,IBM M852 |
中东欧 |
CP855 |
855,IBM 855 |
保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语 |
CP856 |
希伯来语 |
|
CP85 7 |
857,IBM M85 |
土耳其 |
CP858 |
858,IBM 858 |
西欧 |
CP860 |
860,IBM 860 |
葡萄牙语 |
CP861 |
861、CP-IS、IBM861 |
冰岛的 |
CP862 |
862,IBM M862 |
希伯来语 |
CP863型 |
863,IBM M863 |
加拿大人 |
CP864型 |
iBM864 |
阿拉伯语的 |
CP865 |
865,IBM 865 |
丹麦语、挪威语 |
CP866 |
866,IBM 866 |
俄语 |
CP869型 |
869、CP-GR、IBM869 |
希腊人 |
CP84 |
泰国人 |
|
CP875 |
希腊人 |
|
CP932 |
932,ms932,ms kanji,kanji女士 |
日本语 |
CP949 |
949,MS949,UHC |
韩语 |
CP950型 |
950,MS950 |
繁体中文 |
CP1006 |
乌尔都语 |
|
CP1026 |
iBM1026 |
土耳其 |
CP1125 |
1125,IBM1125,CP866U,俄罗斯 |
乌克兰语 3.4 新版功能. |
CP1140 |
iBM1140 |
西欧 |
CP1250 |
Windows 1250 |
中东欧 |
CP1251 |
Windows 1251 |
保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语 |
CP1252 |
Windows 1252 |
西欧 |
CP1253 |
Windows 1253 |
希腊人 |
CP1254 |
windows-1254 |
土耳其 |
CP1255 |
windows-1255 |
希伯来语 |
CP1256型 |
windows-1256 |
阿拉伯语的 |
CP1257 |
Windows 1257 |
波罗的语族 |
CP1258型 |
windows-1258 |
越南的 |
euc_jp |
eucjp、u jis、u-jis |
日本语 |
euc_jis_2004 |
JISX02213,欧盟标准2004 |
日本语 |
euc_jisx0213 |
EGJISX0213 |
日本语 |
euc_kr |
euckr,朝鲜语,ks c 5601,ks_c-5601,ks_c-5601-1987,ks x 1001,ks_x-1001 |
韩语 |
GB23 |
中文、csiso58gb231280、euc-cn、euc cn、euc gb2312-cn、gb2312-1980、gb2312-80、iso-ir-58 |
简体中文 |
丁苯酮 |
936、CP936、MS936 |
统一汉语 |
GB18030 |
GB1803-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分机,ISO-2022-JP-分机 |
日本语 |
iso2022_kr |
CSISO2022KR、ISO2022KR、ISO-2022-KR |
韩语 |
latin_1 |
ISO-8859-1、ISO8859-1、8859、CP819、拉丁语、拉丁语1、L1 |
西欧 |
iso8859_2 |
ISO-8859-2,拉丁语2,l2 |
中东欧 |
iso8859_3 |
ISO-8859-3,拉丁3,L3 |
世界语,马耳他语 |
iso8859_4 |
ISO-8859-4,拉丁语4,L4 |
波罗的语族 |
iso8859_5 |
ISO-8859-5,西里尔文 |
保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语 |
iso8859_6 |
ISO-8859-6,阿拉伯语 |
阿拉伯语的 |
iso8859_7 |
ISO-8859-7,希腊语,希腊语8 |
希腊人 |
iso8859_8 |
ISO-8859-8,希伯来语 |
希伯来语 |
iso8859_9 |
ISO-8859-9,拉丁5,L5 |
土耳其 |
iso8859_10 |
ISO-8859-10,拉丁语6,L6 |
北欧语言 |
iso8859_11 |
ISO-8859-11,泰语 |
泰语 |
iso8859_13 |
ISO-8859-13,拉丁7,L7 |
波罗的语族 |
iso8859_14 |
ISO-8859-14,拉丁语8,L8 |
凯尔特语族 |
iso8859_15 |
ISO-8859-15,拉丁语9,L9 |
西欧 |
iso8859_16 |
ISO-8859-16,拉丁10,L10 |
东南欧 |
乔哈布 |
CP1361,MS1361 |
韩语 |
koi8_r |
俄语 |
|
koi8_t |
塔吉克人 3.5 新版功能. |
|
koi8_u |
乌克兰语 |
|
KZ1048型 |
kz_1048, strk1048_2002, rk1048 |
哈萨克 3.5 新版功能. |
mac_cyrillic |
麦克西里尔的 |
保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语 |
mac_greek |
麦克希腊语 |
希腊人 |
mac_iceland |
麦克冰岛 |
冰岛的 |
mac_latin2 |
MacLatin2、MacCentralEurope、MacCentreuro |
中东欧 |
mac_roman |
Macintosh的Macroman |
西欧 |
mac_turkish |
麦克塔什 |
土耳其 |
PTCP154 |
csptcp154,pt154,cp154,西里尔文亚洲 |
哈萨克 |
shift_jis |
csshiftjis, shiftjis, sjis, s_jis |
日本语 |
shift_jis_2004 |
shiftjis2004, sjis_2004, sjis2004 |
日本语 |
shift_jisx0213 |
shiftjisx0213、s jisx0213、s_jisx0213 |
日本语 |
utf_32 |
U32,UTF32 |
所有语言 |
utf_32_be |
UTF 32 Bbe |
所有语言 |
utf_32_le |
UTF 32 |
所有语言 |
utf_16 |
UTF16 |
所有语言 |
utf_16_be |
UTF 16BE |
所有语言 |
utf_16_le |
UTF 16LE |
所有语言 |
utf_7 |
U7,Unicode-1-1-UTF-7 |
所有语言 |
utf_8 |
u8、utf、utf8、cp65001 |
所有语言 |
utf_8_sig |
所有语言 |
在 3.4 版更改: UTF—16 * 和UTF 32 * 编码器不再允许代理代码点 (U+D800
--`` u+dfff```)要编码。UTF 32 * 解码器不再解码对应于代理代码点的字节序列。
在 3.8 版更改: cp65001
现在是的别名 utf_8
.
特定于python的编码¶
许多预定义的编解码器特定于Python,因此它们的编解码器名称在Python之外没有意义。下表根据预期的输入和输出类型列出了这些类型(请注意,虽然文本编码是编解码器最常见的用例,但底层编解码器基础结构支持任意数据转换,而不仅仅是文本编码)。对于非对称编解码器,所述含义描述编码方向。
文本编码¶
以下编解码器提供 str
到 bytes
编码与 bytes-like object 到 str
解码,类似于Unicode文本编码。
编解码器 |
别名 |
意义 |
---|---|---|
IDNA |
实施 RFC 3490 也见 |
|
MBCS |
ANSI、DBCS |
仅限Windows:根据ANSI代码页(CP_ACP)对操作数进行编码。 |
贴牌生产 |
仅限Windows:根据OEM代码页(CP_oempc)对操作数进行编码。 3.6 新版功能. |
|
帕尔莫斯 |
PalmOS 3.5的编码。 |
|
微代码 |
实施 RFC 3492 . 不支持有状态的编解码器。 |
|
raw_unicode_escape |
拉丁文-1编码 |
|
未定义 |
对所有转换(甚至空字符串)引发异常。忽略错误处理程序。 |
|
unicode_escape |
在ASCII编码的Python源代码中适合作为Unicode文本内容的编码,但引号不转义。从拉丁语-1源代码解码。请注意,Python源代码实际上默认使用UTF-8。 |
在 3.8 版更改: “unicode_internal”编解码器被删除。
二进制转换¶
以下编解码器提供二进制转换: bytes-like object 到 bytes
映射。它们不受 bytes.decode()
(只生产 str
输出)。
编解码器 |
别名 |
意义 |
编码器/解码器 |
---|---|---|---|
base64_codec 1 |
Base64,Base64 |
将操作数转换为多行MIME base64(结果始终包含一个尾部 在 3.4 版更改: 接受任何 bytes-like object 作为编码和解码的输入 |
|
bz2_codec |
BZ2 |
使用bz2压缩操作数。 |
|
hex_codec |
十六进制 |
将操作数转换为十六进制表示,每个字节两位数。 |
|
quopri_codec |
报价,报价可打印,报价可打印 |
将操作数转换为可打印的MIME引号。 |
|
uu_codec |
UU |
使用uuencode转换操作数。 |
|
zlib_codec |
拉链 |
使用gzip压缩操作数。 |
- 1
除了 bytes-like objects ,
'base64_codec'
也只接受ASCII实例str
用于解码
3.2 新版功能: 恢复二进制转换。
在 3.4 版更改: 恢复二进制转换的别名。
文本转换¶
以下编解码器提供文本转换:a str
到 str
地图绘制。它不受 str.encode()
(只生产 bytes
输出)。
编解码器 |
别名 |
意义 |
---|---|---|
rot_13 |
罗13 |
返回操作数的凯撒密码加密。 |
3.2 新版功能: 恢复 rot_13
文本转换。
在 3.4 版更改: 恢复 rot13
别名。
encodings.idna
——应用中的国际化域名¶
此模块实现 RFC 3490 (应用程序中的国际化域名)和 RFC 3492 (NamePrep:国际化域名(IDN)的StringPrep配置文件)。它建立在 punycode
编码与 stringprep
.
这些RFC一起定义了一个协议来支持域名中的非ASCII字符。包含非ASCII字符的域名(例如 www.Alliancefrançaise.nu
)转换为与ASCII兼容的编码(ace,例如 www.xn--alliancefranaise-npb.nu
)然后在协议不允许使用任意字符的所有位置(如DNS查询、HTTP)使用域名的ace形式。 Host 字段等等。这种转换是在应用程序中进行的;如果可能,用户看不见:应用程序应该透明地将unicode域标签转换为线路上的idna,并在将ace标签呈现给用户之前将其转换回unicode。
python通过以下几种方式支持这种转换: idna
codec performs conversion between Unicode and ACE, separating an input string into labels based on the separator characters defined in section 3.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,这样当应用程序将主机名传递给socket模块时,就不必担心转换主机名本身了。除此之外,具有主机名作为函数参数的模块,例如 http.client
和 ftplib
,接受Unicode主机名 (http.client
然后在 Host 字段(如果它发送该字段)。
从连线接收主机名时(例如在反向名称查找中),不会执行到Unicode的自动转换:希望向用户显示此类主机名的应用程序应将其解码为Unicode。
模块 encodings.idna
还实现了NamePrep过程,该过程对主机名执行某些规范化,以实现国际域名不区分大小写,并统一类似字符。如果需要,可以直接使用NamePrep函数。
- encodings.idna.nameprep(label)¶
返回的已准备好名称的版本 标签 . 该实现当前假定查询字符串,因此
AllowUnassigned
是真的。
encodings.mbcs
---Windows ANSI代码页¶
此模块实现ANSI代码页(CP_ACP)。
Availability :仅限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。