codecs
codecs - 编解码器注册表和基类
此模块为标准Python编解码器(编码器和解码器)定义基类,并提供对内部Python编解码器注册表的访问,以管理编解码器和错误处理查找过程。
它定义了以下功能:
codecs.encode(obj[, encoding[, errors]])
使用为编码注册的编解码器编码obj。 默认编码是'ascii'。
可能会给出错误来设置所需的错误处理方案。 默认的错误处理程序是'strict',这意味着编码错误会引发ValueError(或更多的编解码器特定的子类,例如UnicodeEncodeError)。 有关编解码器错误处理的更多信息,请参阅编解码器基类。
2.4版本中的新功能。
codecs.decode(obj[, encoding[, errors]])
使用为编码注册的编码解码器解码obj。 默认编码是'ascii'。
可能会给出错误来设置所需的错误处理方案。 默认的错误处理程序是'strict',这意味着解码错误会引发ValueError(或者更多的编解码器特定的子类,例如UnicodeDecodeError)。 有关编解码器错误处理的更多信息,请参阅编解码器基类。
2.4版本中的新功能。
codecs.register(search_function)
注册编解码器搜索功能。 搜索函数需要一个参数,即所有小写字母的编码名称,并返回具有以下属性的CodecInfo对象:
name
编码的名称;
encode
无状态编码功能;
decode
无状态解码功能;
incrementalencoder
增量编码器类或工厂功能;
incrementaldecoder
增量解码器类或工厂功能;
streamwriter
流编写器类或工厂函数;
streamreader
流读取器类或工厂功能。
各种函数或类采用以下参数:
编码和解码:这些必须是与编解码器实例的encode()/ decode()方法具有相同接口的函数或方法(请参阅编解码器接口)。 预计该功能/方法将以无状态模式工作。
incrementalencoder
和incrementaldecoder
:这些必须是提供以下接口的工厂函数:
factory(errors='strict')
厂函数必须返回提供分别由基类IncrementalEncoder和IncrementalDecoder定义的接口的对象。 增量编解码器可以保持状态。
streamreader
和streamwriter
:这些必须是提供以下接口的工厂函数:
factory(stream, errors='strict')
厂函数必须分别返回提供由基类StreamReader和StreamWriter定义的接口的对象。 流编解码器可以维护状态。
可能的错误值是
'strict'
:在编码错误的情况下引发异常
'replace'
:用合适的替换标记替换格式错误的数据,例如'?'
或'\ufffd'
'ignore'
:忽略格式错误的数据并继续进行,恕不另行通知
'xmlcharrefreplace'
:用适当的XML字符引用替换(仅用于编码)
'backslashreplace'
:用反斜杠转义序列替换(仅用于编码)
以及通过register_error()定义的任何其他错误处理名称。
如果搜索功能找不到给定的编码,它应该返回None。
codecs.lookup(encoding)
在Python编解码器注册表中查找编解码器信息并返回如上定义的CodecInfo对象。
编码首先在注册表的缓存中查找。 如果未找到,则会扫描已注册搜索功能的列表。 如果找不到CodecInfo对象,则会引发LookupError。 否则,CodecInfo对象存储在缓存中并返回给调用者。
为了简化对各种编解码器的访问,模块提供了这些使用lookup()进行编解码器查找的附加功能:
codecs.getencoder(encoding)
查找给定编码的编解码器并返回其编码器功能。
在无法找到编码的情况下引发LookupError。
codecs.getdecoder(encoding)
查找给定编码的编解码器并返回其解码器功能。
在无法找到编码的情况下引发LookupError。
codecs.getincrementalencoder(encoding)
查找给定编码的编解码器并返回其增量编码器类或工厂功能。
如果无法找到编码或者编解码器不支持增量编码器,则会引发LookupError。
2.5版本中的新功能。
codecs.getincrementaldecoder(encoding)
查找给定编码的编解码器并返回其增量解码器类或工厂功能。
如果无法找到编码或者编解码器不支持增量解码器,则会引发LookupError。
2.5版本中的新功能。
codecs.getreader(encoding)
查找给定编码的编解码器并返回其StreamReader类或工厂函数。
在无法找到编码的情况下引发LookupError。
codecs.getwriter(encoding)
查找给定编码的编解码器并返回其StreamWriter类或工厂函数。
在无法找到编码的情况下引发LookupError。
codecs.register_error(name, error_handler)
在名称name
下注册错误处理函数error_handler
。当name
被指定为错误参数时,error_handler
将在编码和解码过程中被调用以防错误。
对于编码error_handler将使用UnicodeEncodeError实例调用,该实例包含有关错误位置的信息。 错误处理程序必须引发这个或另一个异常,或者返回一个元组,替换输入的不可译码部分和编码应该继续的位置。 编码器将对替换进行编码,并继续对指定位置的原始输入进行编码。 负位置值将被视为相对于输入字符串的末尾。 如果产生的位置超出限制,将会引发IndexError。
除UnicodeDecodeError或UnicodeTranslateError之外,解码和翻译工作类似,将被传递到处理程序,并且错误处理程序的替换将直接放入输出。
codecs.lookup_error(name)
返回之前在名称
名称
下注册的错误处理程序。
如果无法找到处理程序,则引发LookupError。
codecs.strict_errors(exception)
实现严格的错误处理:每个编码或解码错误引发一个UnicodeError。
codecs.replace_errors(exception)
实现替换错误处理:格式错误的数据被替换为合适的替换字符,如'?' 在字符串中和Unicode字符串中的'\ ufffd'。
codecs.ignore_errors(exception)
实现忽略错误处理:忽略格式错误的数据,继续编码或解码,恕不另行通知。
codecs.xmlcharrefreplace_errors(exception)
实现xmlcharrefreplace错误处理(仅用于编码):不可编码的字符被替换为适当的XML字符引用。
codecs.backslashreplace_errors(exception)
实现backslashreplace错误处理(仅用于编码):不可编码的字符被替换为反斜杠转义序列。
为了简化编码文件或流的工作,模块还定义了这些实用程序功能:
codecs.open(filename, mode[, encoding[, errors[, buffering]]])
使用给定模式打开编码文件并返回提供透明编码/解码的封装版本。 默认文件模式是'r',表示以读模式打开文件。
注意
包装版本只接受由编解码器定义的对象格式,即大多数内置编解码器的Unicode对象。输出也是编解码器相关的,通常也是Unicode。
注意
即使没有指定二进制模式,文件也始终以二进制模式打开。 这样做是为了避免由于使用8位值的编码造成的数据丢失。 这意味着在读写时不会自动转换'\ n'。
encoding
指定要用于该文件的编码。
可能会给出错误来定义错误处理。 它默认为'strict',这会导致在出现编码错误时引发ValueError。
缓冲与内建的open()函数具有相同的含义。 它默认为行缓冲。
codecs.EncodedFile(file, input[, output[, errors]])
返回提供透明编码转换的文件的包装版本。
写入包装文件的字符串根据给定的输入
编码进行解释,然后使用输出
编码以字符串的形式写入原始文件。中间编码通常是Unicode,但取决于指定的编解码器。
如果没有给出输出
,则默认为输入
。
可能会给出错误来定义错误处理。 它默认为'strict',这会导致在发生编码错误时引发ValueError。
codecs.iterencode(iterable, encoding[, errors])
使用增量编码器来迭代编码由所提供的输入可迭代
。这个功能是一个发生器。错误
(以及任何其他关键字参数)传递给增量编码器。
2.5版本中的新功能。
codecs.iterdecode(iterable, encoding[, errors])
使用增量式解码器迭代
解码由迭代
提供的输入。这个功能是一个发生器。错误
(以及任何其他关键字参数)传递给增量解码器。
2.5版本中的新功能。
该模块还提供以下常数,这些常数对读取和写入平台相关文件非常有用:
codecs.BOMcodecs.BOM_BEcodecs.BOM_LEcodecs.BOM_UTF8codecs.BOM_UTF16codecs.BOM_UTF16_BEcodecs.BOM_UTF16_LEcodecs.BOM_UTF32codecs.BOM_UTF32_BEcodecs.BOM_UTF32_LE
这些常量定义了在UTF-16和UTF-32数据流中使用的Unicode字节顺序标记(BOM)的各种编码,以指示流或文件中使用的字节顺序以及UTF-8中的Unicode签名。 根据平台的本地字节顺序,BOM_UTF16是BOM_UTF16_BE或BOM_UTF16_LE,BOM是BOM_UTF16的别名,BOM_UTF16_LE是BOM_LE,BOM_UTF16_BE是BOM_BE。 其他代表UTF-8和UTF-32编码的BOM。
1.编解码器基类
该codecs
模块定义了一组定义接口的基类,也可以用来轻松编写自己的编解码器以供Python使用。
每个编解码器必须定义四个接口,以使其可用作Python中的编解码器:无状态编码器,无状态解码器,流读取器和流编写器。流读取器和写入器通常重新使用无状态编码器/解码器来实现文件协议。
在Codec
类定义无状态的编码器/解码器的接口。
为了简化和标准化错误处理,encode()和decode()方法可以通过提供错误字符串参数来实现不同的错误处理方案。 以下字符串值由所有标准Python编解码器定义和实现:
值 | 含义 |
---|---|
'strict' | 引发UnicodeError(或一个子类); 这是默认值。 |
'ignore' | 忽略角色并继续下一个。 |
'replace' | 替换为合适的替换字符; Python将使用官方的U + FFFD REPLACEMENT CHARACTER来解码内置的Unicode编解码器和'?' 编码。 |
'xmlcharrefreplace' | 替换为适当的XML字符引用(仅用于编码)。 |
'backslashreplace' | 用反斜杠转义序列替换(仅用于编码)。 |
允许的值的集合可以通过register_error()
扩展。
1.1 编解码器对象
在Codec
类定义这些方法也限定了无状态的编码器和解码器的功能的接口:
Codec.encode(input[, errors])
编码对象输入并返回一个元组(输出对象,消耗的长度)。 虽然编解码器不限于与Unicode一起使用,但在Unicode上下文中,编码会使用特定字符集编码(例如,cp1252或iso-8859-1)将Unicode对象转换为纯文本字符串。
错误
定义了要应用的错误处理。它默认'strict'
处理。
该方法可能不会在编解码器实例中存储状态。 使用StreamWriter编码器必须保持状态,以便使编码更有效率。
在这种情况下,编码器必须能够处理零长度输入并返回输出对象类型的空对象。
Codec.decode(input[, errors])
解码对象输入
并返回一个元组(输出对象,消耗的长度)。在Unicode上下文中,解码将使用特定字符集编码进行编码的纯字符串转换为Unicode对象。
输入
必须是提供bf_getreadbuf
缓冲槽的对象。Python字符串,缓冲区对象和内存映射文件是提供此插槽的对象的示例。
错误
定义了要应用的错误
处理。它默认为'strict'
处理。
该方法可能不会在编解码器实例中存储状态。 将StreamReader用于必须保持状态的编解码器,以便使解码效率更高。
在这种情况下,解码器必须能够处理零长度输入并返回输出对象类型的空对象。
IncrementalEncoder和IncrementalDecoder类为增量编码和解码提供基本接口。 编码/解码输入不是通过一次调用无状态编码器/解码器功能,而是通过多次调用增量编码器/解码器的encode()/ decode()方法来完成的。 增量编码器/解码器在方法调用期间跟踪编码/解码过程。
对encode()
/ decode()
方法调用的连接输出与将所有单个输入合并成一个输入相同,并且使用无状态编码器/解码器对此输入进行编码/解码。
1.2 IncrementalEncoder对象
2.5版本中的新功能。
IncrementalEncoder
类是用于在多个步骤中编码的输入。它定义了每个增量编码器必须定义的以下方法,以便与Python编解码器注册表兼容。
class codecs.IncrementalEncoder([errors])
IncrementalEncoder实例的构造函数。
所有增量编码器都必须提供此构造器接口。他们可以自由添加额外的关键字参数,但只有在这里定义的关键字参数被Python编解码器注册表使用。
该IncrementalEncoder
可以通过提供实现不同的错误
处理方案的错误
关键字参数。这些参数是预定义的:
- 'strict'引发ValueError(或子类); 这是默认值。
'ignore'
忽略角色并继续下一个。
'replace'
替换为合适的替换字符
'xmlcharrefreplace'
替换为适当的XML字符引用
'backslashreplace'
用反斜杠转义序列替换。
错误参数将被分配给同名的属性。 赋值给这个属性可以在IncrementalEncoder对象的生命周期中在不同的错误处理策略之间切换。
可以使用register_error()扩展errors参数的允许值集。
encode(object[, final])
编码对象(考虑编码器的当前状态)并返回结果编码对象。 如果这是最后一次调用encode(),final必须为true(默认值为false)。
reset()
将编码器重置为初始状态。
1.3 IncrementalDecoder对象
IncrementalDecoder类用于以多个步骤解码输入。 它定义了每个增量解码器必须定义的以下方法,以便与Python编解码器注册表兼容。
class codecs.IncrementalDecoder([errors])
一个IncrementalDecoder
实例的构造函数。
所有增量解码器都必须提供此构造器接口。他们可以自由添加额外的关键字参数,但只有在这里定义的关键字参数被Python编解码器注册表使用。
该IncrementalDecoder
可以通过提供实现不同的错误
处理方案的错误
关键字参数。这些参数是预定义的:
- 'strict' 引发ValueError(或子类); 这是默认值。
'ignore'
忽略角色并继续下一个。
'replace'
替换为合适的替换字符。
错误参数将被分配给同名的属性。 赋值给该属性可以在IncrementalDecoder对象的生命周期中在不同的错误处理策略之间切换。
错误
参数的允许值的集合可以扩展register_error()
。
decode(object[, final])
解码对象
(考虑解码器的当前状态)并返回结果解码对象
。如果这是最后一次调用decode()
final(
必须为true)(默认值为false)。如果final
为true,则解码器必须完全解码输入,并且必须清空所有缓冲区。如果这是不可能的(例如由于输入末尾的字节序列不完整),它必须启动错误处理,就像在无状态的情况下一样(这可能会引发异常)。
reset()
Reset the decoder to the initial state.
在StreamWriter
和StreamReader
类提供可用于非常容易地实现新的编码子模块的通用的工作界面。请参阅有关encodings.utf_8
如何完成的示例。
1.4 StreamWriter对象
StreamWriter类是Codec的一个子类,它定义了为了与Python编解码器注册表兼容而必须定义的以下方法。
class codecs.StreamWriter(stream[, errors])
构造函数的一个StreamWriter
实例。
所有流写入器都必须提供此构造器接口。他们可以自由添加额外的关键字参数,但只有在这里定义的关键字参数被Python编解码器注册表使用。
流
必须是用于写入二进制数据的文件类对象。
该StreamWriter
可以通过提供实现不同的错误
处理方案的错误
关键字参数。这些参数是预定义的:
- 'strict'引发ValueError(或子类); 这是默认值。
'ignore'
忽略角色并继续下一个。
'replace'
替换为合适的替换字符
'xmlcharrefreplace'
替换为适当的XML字符引用
'backslashreplace'
用反斜杠转义序列替换。
错误参数将被分配给同名的属性。 赋值给该属性可以在StreamWriter对象的生命周期中在不同的错误处理策略之间切换。
错误
参数的允许值的集合可以扩展register_error()
。
write(object)
将编码对象的内容写入流中。
writelines(list)
将连接的字符串列表写入流中(可能通过重用该write()
方法)。
reset()
刷新并重置用于保持状态的编解码器缓冲区。
调用此方法应确保将输出中的数据置于干净状态,以允许附加新的新数据,而无需重新扫描整个流以恢复状态。
除了上述方法之外,StreamWriter
还必须从基础流继承所有其他方法和属性。
1.5 StreamReader对象
StreamReader类是Codec的一个子类,它定义了以下每个流读者必须定义的方法,以便与Python编解码器注册表兼容。
class codecs.StreamReader(stream[, errors])
构造函数的一个StreamReader
实例。
所有流读取器都必须提供此构造器接口。他们可以自由添加额外的关键字参数,但只有在这里定义的关键字参数被Python编解码器注册表使用。
流
必须是一个文件类对象,用于读取(二进制)数据。
该StreamReader
可以通过提供实现不同的错误
处理方案的错误
关键字参数。这些参数被定义:
- 'strict'引发ValueError(或子类); 这是默认值。
'ignore'
忽略角色并继续下一个。
'replace'
替换为合适的替换字符。
错误参数将被分配给同名的属性。 分配给该属性可以在StreamReader对象的生命周期中在不同的错误处理策略之间切换。
可以使用register_error()扩展errors参数的允许值集。
read([size[, chars[, firstline]]])
解码流中的数据并返回结果对象。
字符
表示要从流中读取的字符数。read()
永远不会返回超过字符的
字符,但如果没有足够的字符可用,它可能会返回更少。
大小
表示为了解码目的从流中读取的近似最大字节数。解码器可以根据需要修改此设置。默认值-1表示尽可能多地读取和解码。大小
旨在防止在一个步骤中解码大文件。
firstline
表示如果在后面的行上有解码错误,则只返回第一行就足够了。
该方法应该使用贪婪读取策略,这意味着它应该读取尽可能多的数据,比如在编码的定义和给定大小内所允许的数据,例如,如果可选的编码结束或状态标记在流上可用,则这些也应该被读取。
版本2.4中更改:添加了字符
参数。
改变在2.4.2版本:添加FIRSTLINE
参数。
readline([size[, keepends]])
从输入流中读取一行并返回解码后的数据。
如果给定大小,则将其作为大小参数传递给流的read()方法。
如果keepends
是错误的行结束将从返回的行中被删除。
在版本2.4中进行了更改:添加了keepends
参数。
readlines([sizehint[, keepends]])
读取输入流中可用的所有行,并将它们作为行列表返回。
行尾是使用编解码器的解码器方法实现的,并且如果keepends
为真,则包含在列表条目中。
sizehint
(如果给定)作为size
参数传递给流的read()
方法。
reset()
重置用于保持状态的编解码器缓冲区。
请注意,不应该发生流重定位。这种方法主要是为了能够从解码错误中恢复。
除了上述方法之外,StreamReader
还必须从基础流继承所有其他方法和属性。
接下来的两个基类是为了方便而包含的。编解码器注册表不需要它们,但可能会在实践中提供帮助。
1.6 StreamReaderWriter对象
在StreamReaderWriter
允许包裹流,其工作在读写模式。
设计是这样的,可以使用lookup()函数返回的工厂函数来构造实例。
class codecs.StreamReaderWriter(stream, Reader, Writer, errors)
创建一个StreamReaderWriter实例。 流必须是文件类对象。 Reader和Writer必须是工厂函数或提供StreamReader和StreamWriter接口的类。 错误处理以与流读取器和写入器定义相同的方式完成。
StreamReaderWriter
实例定义StreamReader
和StreamWriter
类的组合接口。它们从基础流继承所有其他方法和属性。
1.7 StreamRecoder对象
在StreamRecoder
提供一个前端-编码数据与不同的编码环境处理时有时它是有用的后端视图。
设计是这样的,可以使用lookup()函数返回的工厂函数来构造实例。
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors)
创建一个实现双向转换的StreamRecoder实例:在Reader和Writer在后端工作(读取和写入流)时对前端(读取()和输出write())的输入进行编码和解码。
您可以使用这些对象进行从例如Latin-1到UTF-8的透明直接重新编码,并返回。
流
必须是文件类对象。
编码,解码必须坚持编解码器接口。 Reader,Writer必须是工厂函数或分别提供StreamReader和StreamWriter接口的对象的类。
编码
和解码
需要针对前端翻译,读者
和写者
的后端平移。所使用的中间格式由两组编解码器确定,例如,Unicode编解码器将使用Unicode作为中间编码。
错误处理以与流读取器和写入器定义相同的方式完成。
StreamRecoder实例定义StreamReader和StreamWriter类的组合接口。 它们从基础流继承所有其他方法和属性。
2.编码和Unicode
Unicode字符串在内部存储为代码点序列(与Py_UNICODE数组一样精确)。根据Python编译的方式(通过--enable-unicode = ucs2或--enable-unicode = ucs4,前者是默认值)Py_UNICODE可以是16位或32位数据类型。一旦在CPU和内存之外使用Unicode对象,CPU字节顺序以及这些数组作为字节存储的方式成为问题。将unicode对象转换为字节序列称为编码,并且从字节序列重新创建unicode对象称为解码。有多种不同的方法可以完成这种转换(这些方法也称为编码)。最简单的方法是将代码点0-255映射到字节0x0-0xff。这意味着包含高于U + 00FF的代码点的unicode对象不能用此方法编码(称为'latin-1'或'iso-8859-1')。 unicode.encode()会引发一个如下所示的UnicodeEncodeError:UnicodeEncodeError:'latin-1'编解码器无法对位置3中的字符u'\ u1234'进行编码:序号不在范围内(256)。
还有另一组编码(所谓的charmap编码),它们选择所有unicode代码点的不同子集以及这些代码点如何映射到字节0x0-0xff。 要查看如何完成这个操作,只需打开例如 编码/ 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具有第二个目的,即零宽度无间隔空间:一个没有宽度并且不允许单词被分割的字符。它可以例如用于提示连字算法。使用U + FEFF作为零宽度无间断空间的Unicode 4.0已被弃用(使用U + 2060(WORD JOINER)承担此角色)。尽管如此,Unicode软件仍然必须能够在两种角色下处理U + FEFF:作为BOM,它是确定编码字节的存储布局的设备,一旦字节序列被解码为Unicode字符串,就会消失;作为零宽度不间断空间,这是一个正常的字符,将被解码为类似于其他的字符。
还有另一种编码能够编码全部的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,并且解码的Unicode字符串中的任何U + FEFF字符(即使它是第一个字符)都被视为零宽度无间隔空间。
没有外部信息,就不可能可靠地确定使用哪种编码来编码Unicode字符串。 每个charmap编码可以解码任何随机字节序列。 但UTF-8无法实现,因为UTF-8字节序列具有不允许任意字节序列的结构。 为了提高可检测到UTF-8编码的可靠性,Microsoft为其记事本程序发明了UTF-8的变体(Python 2.5称为“utf-8-sig”):在写入任何Unicode字符之前 该文件将写入一个UTF-8编码BOM(它看起来像是一个字节序列:0xef,0xbb,0xbf)。 因为任何charmap编码文件都以这些字节值开头(例如映射到)是不可能的
在iso-8859-1中),这增加了从字节序列正确猜测utf-8-sig编码的可能性。 所以这里的BOM并不能用于确定用于生成字节序列的字节顺序,而是用作帮助猜测编码的签名。 编码时,utf-8-sig编解码器会将0xef,0xbb,0xbf作为前三个字节写入文件。 在解码utf-8-sig时,如果它们显示为文件中的前三个字节,则会跳过这三个字节。 在UTF-8中,不鼓励使用BOM,通常应避免使用。
3.标准编码
Python带有一些内置的编解码器,可以作为C函数或字典作为映射表来实现。下表按名称列出了编解码器,以及一些常用别名,以及可能使用编码的语言。别名列表和语言列表都不是详尽无遗的。请注意,仅在大小写不同的情况下使用拼写替代方法或使用连字符而不是下划线也是有效的别名; 因此,例如'utf-8'
,对于'utf_8'
编解码器而言是有效的别名。
许多字符集都支持相同的语言。它们在个别字符(例如,欧元符号是否被支持)以及在将字符分配给代码位置上有所不同。对于欧洲语言尤其如此,通常存在以下变体:
- ISO 8859代码集
- 一个Microsoft Windows代码页,通常从8859代码集派生而来,但用其他图形字符替换控制字符
- 一个IBM EBCDIC代码页
- IBM PC代码页,与ASCII兼容
编解码器 | 别名 | 语言 |
---|---|---|
ASCII | 646,us-ascii | 英语 |
中文 | big5-tw,csbig5 | 繁体中文 |
big5hkscs | big5-hkscs,hkscs | 繁体中文 |
cp037 | IBM037,IBM039 | 英语 |
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 | 土耳其语 |
cp1140 | ibm1140 | 西欧语 |
CP1250 | 窗户-1250 | 中欧语和东欧语 |
CP1251 | 窗户-1251 | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
CP1252 | 窗口1252 | 西欧语 |
cp1253 | 窗户-1253 | 希腊语 |
cp1254 | 窗户-1254 | 土耳其语 |
cp1255 | 窗户-1255 | 希伯来语 |
cp1256 | 窗户-1256 | 阿拉伯语 |
cp1257 | 窗户-1257 | 波罗语 |
cp1258 | 窗户-1258 | 越南语 |
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,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,西里尔文 | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
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_u | | 乌克兰语 |
mac_cyrillic | maccyrillic | 保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语 |
mac_greek | macgreek | 希腊语 |
mac_iceland | maciceland | 冰岛语 |
mac_latin2 | maclatin2,maccentraleurope | 中欧语和东欧语 |
mac_roman | macroman一致 | 西欧语 |
mac_turkish | macturkish | 土耳其语 |
ptcp154 | csptcp154,pt154,cp154,西里尔文的亚洲人 | 哈萨克语 |
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 | 所有语言(仅限BMP) |
utf_16_le | UTF-16LE | 所有语言(仅限BMP) |
utf_7 | U7,unicode-1-1-utf-7 | 所有语言 |
UTF_8 | U8,UTF,utf8 | 所有语言 |
utf_8_sig | | 所有语言 |
4. Python特定的编码
一些预定义的编解码器是Python特有的,因此它们的编解码器名称在Python之外没有任何意义。根据预期的输入和输出类型,这些在下表中列出(请注意,虽然文本编码是编解码器最常见的用例,但底层编解码器基础结构支持任意数据转换,而不仅仅支持文本编码)。对于不对称编解码器,所述目的描述编码方向。
与Unicode文本编码类似,以下编解码器提供了unicode-to-str编码[1]和str-to-unicode解码[2]。
编解码器 | 别名 | 目的 |
---|---|---|
IDN | | 实现RFC 3490,另请参阅encodings.idna |
MBCS | DBCS | 仅Windows:根据ANSI代码页(CP_ACP)对操作数进行编码 |
的PalmOS | | PalmOS 3.5的编码 |
Punycode码 | | 实现RFC 3492 |
raw_unicode_escape | | 生成一个适合作为Python源代码中的原始Unicode文字的字符串 |
rot_13 | ROT13 | 返回操作数的凯撒密码加密 |
未定义 | | 引发所有转化的例外情况。如果不需要字节和Unicode字符串之间的自动强制,可以用作系统编码。 |
unicode_escape | | 在Python源代码中生成适合Unicode字符串的字符串 |
unicode_internal | | 返回操作数的内部表示 |
版本2.3中的新功能:idna
和punycode
编码。
以下编解码器提供了str-to-str编码和解码[2]。
编解码器 | 别名 | 目的 | 编码器/解码器 |
---|---|---|---|
base64_codec | base64,base-64 | 将操作数转换为多行MIME base64(结果始终包含尾随'\ n') | base64.encodestring(),base64.decodestring() |
bz2_codec | BZ2 | 使用bz2压缩操作数 | bz2.compress(),bz2.decompress() |
hex_codec | 十六进制 | 将操作数转换为十六进制表示,每个字节有两位数字 | binascii.b2a_hex(),binascii.a2b_hex() |
quopri_codec | quopri,quoted-printable,quotedprintable | 将操作数转换为可引用的MIME引用 | quopri.encode()with quotetabs = True,quopri.decode() |
string_escape | | 在Python源代码中生成一个适合作为字符串字符串的字符串 | |
uu_codec | 该 | 使用uuencode转换操作数 | he.encode(),he.decode() |
zlib_codec | zip,zlib | 使用gzip压缩操作数 | zlib.compress(),zlib.decompress() |
1 | str对象也被接受为输入来代替unicode对象。通过使用默认编码对它们进行解码,它们被隐式转换为unicode。如果此转换失败,则可能会导致引发UnicodeDecodeError的编码操作。 |
---|
2 | (1,2)unicode对象也被接受为str对象的输入。通过使用默认编码对它们进行编码,它们被隐式转换为str。如果此转换失败,则可能导致解码操作引发UnicodeEncodeError。 |
---|
5. encodings.idna - 应用程序中的国际化域名
2.3版本的新功能。
该模块实现RFC 3490
(应用程序中的国际化域名)和RFC 3492
(Nameprep:国际化域名(IDN)的Stringprep配置文件)。它建立在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节(1)中定义的分隔符将输入字符串分离为标签,并根据需要将每个标签转换为ACE,相反 将输入字节串分成基于标签的标签。 分隔符并将任何发现的ACE标签转换为unicode。 此外,套接字模块将Unicode主机名透明地转换为ACE,以便应用程序在将主机名传递给套接字模块时不必担心自己将其转换为主机名。 最重要的是,具有主机名称作为函数参数的模块(例如httplib和ftplib)接受Unicode主机名称(如果httplib发送该字段,则它也透明地在主机字段中发送IDNA主机名)。
从线路接收主机名时(例如在反向名称查找中),不会自动转换为Unicode:希望向用户显示此类主机名的应用程序应将它们解码为Unicode。
该模块encodings.idna
还实现了nameprep过程,该过程对主机名执行一定的规范化,实现国际域名不区分大小写,统一类似字符。如果需要,可以直接使用nameprep函数。
encodings.idna.nameprep(label)
返回标签
的nameprepped版本。该实现目前假定查询字符串,所以AllowUnassigned
为true。
encodings.idna.ToASCII(label)
按照RFC 3490中的
规定将标签转换为ASCII 。UseSTD3ASCIIRules
被假定为假。
encodings.idna.ToUnicode(label)
按RFC 3490中的
规定将标签转换为Unicode 。
6. encodings.utf_8_sig - 带有BOM注明的UTF-8编解码器
2.5版本中的新功能。
该模块实现了UTF-8编解码器的一种变体:在编码时,UTF-8编码的BOM将被添加到UTF-8编码的字节中。对于有状态编码器,这只会执行一次(在第一次写入字节流时)。在数据开始时解码可选的UTF-8编码BOM将被跳过。