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, aLookupError
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
¶ 增量编码器和解码器类或工厂功能。这些必须分别提供由基类
IncrementalEncoder
和IncrementalDecoder
定义的接口。增量编解码器可以保持状态。
-
streamwriter
¶ -
streamreader
¶ 流式写入器和读取器类或工厂功能。这些必须分别提供由基类
StreamWriter
和StreamReader
定义的接口。流编解码器可以维护状态。
-
为了简化对各种编解码器组件的访问,模块提供了使用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)¶使用增量编码器迭代编码迭代器提供的输入。这个函数是一个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编码的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+DC80 到U+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_handler。The 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
实例调用,其中包含有关错误位置的信息。错误处理程序必须提出这个或另一个异常,或返回一个元组,替换输入的不可解码部分和编码应该继续的位置。替换可以是str
或bytes
。如果替换为字节,编码器将简单地将它们复制到输出缓冲区中。如果替换为字符串,则编码器将对替换进行编码。编码继续在指定位置的原始输入。负位置值将被视为相对于输入字符串的末尾。如果结果位置超出限制,将会引发IndexError
。除了
UnicodeDecodeError
或UnicodeTranslateError
之外,解码和翻译的工作方式相同,将传递给处理程序,并且错误处理程序的替换将直接放入输出中。
以前注册的错误处理程序(包括标准错误处理程序)可以按名称查找:
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使用特定的字符集编码(例如
cp1252
或iso-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
对象的生命周期内在不同的错误处理策略之间切换。重置 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)¶将编码对象的内容写入流中。
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. Reader和Writer必须是提供StreamReader
和StreamWriter
接口的工厂函数或类。错误处理以与流读取器和写入器定义相同的方式完成。
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()
,而Reader和Writer在后端工作 - / T11>。您可以使用这些对象来执行透明转码。Latin-1转换为UTF-8并返回。
stream参数必须是一个类似文件的对象。
encode和decode参数必须遵守
Codec
接口。Reader and Writer must be factory functions or classes providing objects of theStreamReader
andStreamWriter
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-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
时,字节必须交换在解码。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+2060
(WORD 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-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位。
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(它看起来像是一个字节序列:0xef
,0xbb
,0xbf
由于任何charmap编码文件都以这些字节值开始(例如,映射到
LATIN SMALL LETTER I WITH DIAERESISRIGHT-POINTING DOUBLE ANGLE QUOTATION MARKINVERTED 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兼容
编解码器 | 别名 | 语言 |
---|---|---|
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 | 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,8889,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,阿拉伯语 | 阿拉伯 |
iso8859_7 | iso-8859-7,希腊语,希腊语8 | 希腊语 |
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 | 宏观人,麦金托什 | 西欧 |
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:根据ANSI代码页(CP_ACP)对操作数进行编码 |
的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废弃。 |
7.2.4.2.二进制变换¶
以下编解码器提供了二进制转换:bytes-like object到bytes
映射。它们不受bytes.decode()
(仅产生str
输出)的支持。
编解码器 | 别名 | 目的 | 编码器/解码器 |
---|---|---|---|
base64_codec [1] | base64,base_64 | 将操作数转换为多行MIME base64(结果始终包含尾部 Changed in version 3.4: accepts any bytes-like object as input for encoding and decoding | 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() with quotetabs=True / quopri.decode() |
uu_codec | UU | 使用uuencode转换操作数 | uu.encode() / uu.decode() |
zlib_codec | zip,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.文本转换¶
下面的编解码器提供了一个文本转换:一个str
到str
映射。它不受str.encode()
(仅产生bytes
输出)的支持。
编解码器 | 别名 | 目的 |
---|---|---|
rot_13 | ROT13 | 返回操作数的凯撒密码加密 |
版本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。
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将被跳过。