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
¶增量编码器和解码器类或工厂功能。这些必须分别提供由基类
IncrementalEncoder
和IncrementalDecoder
定义的接口。增量编码解码器能保持状态。
streamwriter
¶streamreader
¶流写入器和读取器类或工厂函数。这些必须分别提供由基类
StreamWriter
和StreamReader
定义的接口。流的编解码器能保持状态。
为了简化对各种编解码器组件的访问,模块提供了使用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)¶使用增量编码器对由迭代器提供的输入进行迭代编码。此函数是generator。errors参数(以及任何其他关键字参数)传递到增量编码器。
codecs.
iterdecode
(iterator, encoding, errors='strict', **kwargs)¶使用增量解码器对由迭代器提供的输入进行迭代解码。此函数是generator。errors参数(以及任何其他关键字参数)传递到增量解码器。
本模块还提供下列常量的读取和写入平台依赖文件非常有用:
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 eitherBOM_UTF16_BE
orBOM_UTF16_LE
depending on the platform’s native byte order,BOM
is an alias forBOM_UTF16
,BOM_LE
forBOM_UTF16_LE
andBOM_BE
forBOM_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+DC80 到U+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,其中包含有关错误位置的信息。错误处理程序必须引用这个或不同的异常,或返回一个替换为输入的不可编辑部分的元组和编码应该继续的位置。替换可以是str
或bytes
。如果替换是字节,则编码器将它们简单地复制到输出缓冲器中。如果替换是字符串,则编码器将对替换进行编码。在指定位置的原始输入上继续编码。负位置值将被视为相对于输入字符串的结尾。如果结果位置超出边界,则会引发IndexError
。除了
UnicodeDecodeError
或UnicodeTranslateError
之外,解码和转换的工作方式类似,将传递给处理程序,并将错误处理程序中的替换直接放入输出。
以前注册的错误处理程序(包括标准错误处理程序)可以按名称查找:
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使用特定字符集编码将字符串对象转换为字节对象(例如,
cp1252
或iso-8859-1
)。errors参数定义要应用的错误处理。它默认为
'strict'
处理。该方法可能不会将状态存储在
Codec
实例中。使用StreamWriter
编解码器,必须保持状态才能使编码高效。编码器必须能够处理零长度的输入,并返回一个输出的对象类型的空对象,在这种情况。
Codec.
decode
(input[, errors])¶解码对象的输入,并返回一个元组 (输出对象,消耗的长度)。对于实例,对于text encoding,解码将使用特定字符集编码进行编码的字节对象转换为字符串对象。
对于文本编码和字节到字节编解码器,输入必须是字节对象或提供只读缓冲区接口的对象,例如缓冲区对象和内存映射文件。
errors参数定义要应用的错误处理。它默认为
'strict'
处理。该方法可能不会将状态存储在
Codec
实例中。使用StreamReader
编解码器,必须保持状态才能使解码高效。解码器必须能够处理零长度的输入,并返回一个输出的对象类型的空对象,在这种情况。
7.2.1.3.增量编码和解码¶
IncrementalEncoder
和IncrementalDecoder
类为增量编码和解码提供了基本接口。对输入的编码/解码不是通过对无状态编码器/解码器功能的一次调用来完成的,而是对多次调用encode()
/ decode()
增量编码器/解码器在方法调用期间跟踪的编码解码过程。
对encode()
/ decode()
方法的调用的连接输出与所有单个输入合并为一个相同,并且此输入被编码/解码与无状态编码器/解码器。
7.2.1.3.1.IncrementalEncoder对象¶
IncrementalEncoder
类用于在多个步骤中对输入进行编码。它定义了每个增量编码器必须定义要符合 Python 编解码器注册表的以下方法。
- class
codecs.
IncrementalEncoder
(errors='strict')¶ IncrementalEncoder
实例的构造函数。所有的增量式编码器必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。
IncrementalEncoder
可以通过提供错误关键字参数来实现不同的错误处理方案。有关可能的值,请参见Error Handlers。错误参数将分配到具有相同名称的属性。分配此属性可以在
IncrementalEncoder
对象的生命周期内在不同的错误处理策略之间切换。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.流编码和解码¶
StreamWriter
和StreamReader
类提供了通用的工作接口,可以非常轻松地实现新的编码子模块。有关如何完成此操作的示例,请参见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)¶写入到流编码的对象的内容。
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
实例。流必须是一个类似文件的对象。Reader和Writer必须是提供StreamReader
和StreamWriter
接口的工厂函数或类。错误处理是以同样的方式界定为流的读者和作家。
StreamReaderWriter
实例定义StreamReader
和StreamWriter
类的组合接口。从基础流,他们继承所有其他方法和属性。
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 callingread()
andwrite()
, while Reader and Writer work on the backend — the data in stream.您可以使用这些对象做透明转码,例如拉丁语-1到UTF-8和回。
流参数必须是类似文件的对象。
编码和解码参数必须遵守
Codec
接口。Reader和Writer必须是分别提供StreamReader
和StreamWriter
接口对象的工厂函数或类。错误处理是以同样的方式界定为流的读者和作家。
StreamRecoder
实例定义StreamReader
和StreamWriter
类的组合接口。从基础流,他们继承所有其他方法和属性。
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-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
的第二个用途是ZERO WIDTH NO-BREAK SPACE
:没有宽度且不允许单词分割的字符。它可以例如。用于给连字算法提示。使用Unicode 4.0使用U+FEFF
作为ZERO WIDTH NO-BREAK 假设此角色已弃用(使用
尽管如此,Unicode软件仍然必须能够在两种角色中处理U+2060
(WORD JOINER
)) )。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
字符(即使它是第一个字符)都被视为零 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(它看起来像一个字节序列:0xef
,0xbb
,0xbf
因为任何charmap编码文件都以这些字节值开头是不太可能的。映射到
LATIN SMALL LETTER I WITH DIAERESISRIGHT-POINTING DOUBLE ANGLE QUOTATION MARKINVERTED QUESTION MARK
在iso-8859-1中),这增加了可以从字节序列正确猜测utf-8-sig
编码的概率。这里不使用物料清单必须能够确定用于生成的字节序列的字节顺序,但作为签名,有助于在猜测的编码。在编码时,utf-8-sig编解码器将把0xef
,0xbb
,0xbf
作为前三个字节写入文件。如果解码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
编解码器 | 别名 | 语言 |
---|---|---|
ascii | 646,us-ascii | 英语 |
big5 | 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 | 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 | 越南语 |
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 | chinese, 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, cyrillic | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
iso8859_6 | iso-8859-6,arabic | 阿拉伯 |
iso8859_7 | iso-8859-7,greek,greek8 | 希腊语 |
iso8859_8 | iso-8859-8,hebrew | 希伯来语 |
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 | macroman,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 *解码器不再解码对应于代理码点的字节序列。
7.2.4.Python特定编码¶
大量的预定义的编码解码器是特定于 Python 是一种,所以他们的编解码器名字有外 Python 没有意义。这些都是基于预期的输入和输出类型 (请注意尽管文本编码是最常见的使用情况,为编解码器,基础的编解码器支持任意数据转换,而不是只是文本编码) 以下的表格中列出。对于不对称的编解码器,所述的目的描述编码方向。
7.2.4.1.文本编码¶
以下编解码器提供str
到bytes
编码和bytes-like object到str
解码,类似于Unicode文本编码。
编解码器 | 别名 | 目的 |
---|---|---|
idna | 实现 RFC 3490,另请参见encodings.idna 。仅支持errors='strict' 。 | |
mbcs | dbcs | Windows only: Encode operand according to the ANSI codepage (CP_ACP) |
palmos | Encoding 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 object到bytes
映射。bytes.decode()
(仅生成str
输出)不支持它们。
编解码器 | 别名 | 目的 | 编码器/解码器 |
---|---|---|---|
base64_codec [1] | base64,base_64 | 将操作数转换为多行MIME base64(结果始终包含尾随 在版本3.4中更改:接受任何bytes-like object作为编码和解码的输入 | base64.encodebytes() / base64.decodebytes() |
bz2_codec | bz2 | Compress the operand using bz2 | bz2.compress() / bz2.decompress() |
hex_codec | 十六进制 | Convert operand to hexadecimal representation, with two digits per byte | binascii.b2a_hex() / binascii.a2b_hex() |
quopri_codec | quopri,quotedprintable,quoted_printable | Convert operand to MIME quoted printable | quopri.encode() 与quotetabs=True / quopri.decode() |
uu_codec | uu | Convert the operand using uuencode | uu.encode() / uu.decode() |
zlib_codec | zip,zlib | Compress the operand using gzip | zlib.compress() / zlib.decompress() |
[1] | 除了bytes-like objects,'base64_codec' 也接受str 的仅ASCII实例用于解码 |
版本3.2中的新功能:恢复二进制转换。
在版本3.4中更改:恢复二进制变换的别名。
7.2.4.3.文本转换¶
以下编解码器提供文本转换:str
到str
映射。str.encode()
(仅生成bytes
输出)不支持。
编解码器 | 别名 | 目的 |
---|---|---|
rot_13 | rot13 | Returns 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。
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 数据的开头将被跳过。