7.8. codecs编码解码器的注册和基本的类

本模块定义标准 Python 编码解码器 (编码器和解码器) 的基类,并提供对内部管理的编解码器和错误处理查找过程的 Python 编解码器注册表的访问。

它定义了以下函数:

codecs.encode(obj[, encoding[, errors]])

使用注册名为encoding的编解码器编码obj默认编码是'ascii'

错误可能会给以设置所需的错误处理方案。默认错误处理程序是'严格'意味着编码错误引发ValueError (或多个编解码器特定的子类,如UnicodeEncodeError)。有关编解码器错误处理的详细信息,请参阅编解码器基类

在 2.4 版本新。

codecs.decode(obj[, encoding[, errors]])

使用注册名为encoding的解码器解码obj默认编码是'ascii'

错误可能会给以设置所需的错误处理方案。默认错误处理程序是'严格'意味着解码错误引发ValueError (或多个编解码器特定的子类,如UnicodeDecodeError)。有关编解码器错误处理的详细信息,请参阅编解码器基类

在 2.4 版本新。

codecs.register(search_function)

注册编码解码器查找函数。查找函数接受一个参数——全小写字母的编码名称,并返回一个CodecInfo对象,该对象具有以下属性:

  • name 编码名
  • encode 无状态编码函数
  • decode 无状态解码函数
  • incrementalencoder 递增式编码类或工厂函数
  • incrementaldecoder An incremental decoder class or factory function;
  • streamwriter 流式writer类或工厂函数
  • streamreader A stream reader class or factory function.

不同的函数或类含有下列参数:

编码解码: 这些必须的函数或方法具有相同的接口encode()/decode()方法的编码解码器实例 (请参阅编解码器接口)。函数/方法预计将在无国籍的模式下工作。

incrementalencoderincrementaldecoder: 它们必须是工厂函数提供以下接口:

factory(errors='strict')

工厂函数必须返回对象提供基类,这些类IncrementalEncoderIncrementalDecoder,分别定义的接口。增量编码解码器能保持状态。

streamreaderstreamwriter: 它们必须是工厂函数提供以下接口:

factory(stream, errors='strict')

工厂函数必须返回对象提供基类,这些类StreamReaderStreamWriter,分别定义的接口。流的编解码器能保持状态。

可能值为错误

  • 'strict': raise an exception in case of an encoding error
  • 'replace': replace malformed data with a suitable replacement marker, such as '?' or '\ufffd'
  • 'ignore': ignore malformed data and continue without further notice
  • 'xmlcharrefreplace': replace with the appropriate XML character reference (for encoding only)
  • 'backslashreplace': replace with backslashed escape sequences (for encoding only)

以及任何其他的错误处理通过register_error()定义的名称。

万一一个搜索功能找不到给定的编码,它应该返回

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)

注册错误处理函数error_handler名称的名称在编码和解码出错的情况下,当作为错误参数指定名称,将调用error_handler

编码error_handler将调用一个UnicodeEncodeError实例,其中包含有关错误的位置信息。错误处理程序必须提高这或一个不同的异常或返回一个元组替换为输入和编码应位置的 unencodable 部分。编码器将编码替换,并继续编码,原来的输入,在指定的位置。负位置值将被视为相对于输入字符串的结尾。如果没有绑定的最终位置将引发IndexError

解码和翻译作品类似,除了UnicodeDecodeErrorUnicodeTranslateError将传递给处理程序和替换从错误处理程序将直接投入产出。

codecs.lookup_error(name)

返回根据名称名称以前注册的错误处理程序。

找不到该处理程序的情况下,提出了LookupError

codecs.strict_errors(exception)

实施严格的错误处理: 每个编码或解码错误引发的UnicodeError

codecs.replace_errors(exception)

实现替换错误处理: 格式错误的数据被替换为合适的替换字符如'?'在 bytestrings 和'' Unicode 字符串中。

codecs.ignore_errors(exception)

实现忽略错误处理: 忽略格式不正确的数据和编码或解码持续而不必另行通知。

codecs.xmlcharrefreplace_errors(exception)

实现的xmlcharrefreplace错误处理 (用于编码只): unencodable 的字符被替换为适当的 XML 字符引用。

codecs.backslashreplace_errors(exception)

实现的backslashreplace错误处理 (用于编码只): unencodable 的字符被替换为带有反斜杠转义序列。

为了简化编码的文件或流处理,该模块还定义了这些实用功能:

codecs.open(filename, mode[, encoding[, errors[, buffering]]])

打开经过编码的文件,使用给定的模式并返回提供透明的编码解码的包的版本。默认文件模式是'r'的意思在只读模式下打开该文件。

包装的版本将只接受的编解码器,即大多数内置解码器的 Unicode 对象定义的对象格式。输出也是编解码器依赖,并通常会以及 Unicode。

在二进制模式中,总是打开文件,即使指定了没有二进制模式。这样做的目的是为了避免由于使用 8 位值的编码的数据丢失。这意味着,没有自动转换的''在阅读和写作上完成。

编码指定要用于该文件的编码。

错误可能会给出了定义的错误处理。它默认为'严格'导致ValueError筹集以防出现编码错误。

缓冲已内置open ()函数相同的含义。默认的缓冲线。

codecs.EncodedFile(file, input[, output[, errors]])

返回包装提供了透明的编码翻译的文件的版本。

根据给定输入编码解释字符串写入到包裹文件并将其然后作为使用输出编码的字符串写入原始文件。中间的编码通常将 Unicode,但取决于指定的编码解码器。

如果不给定输出,它默认为输入

错误可能会给出了定义的错误处理。它默认为'严格',这将导致ValueError筹集出现编码错误的情况下。

codecs.iterencode(iterable, encoding[, errors])

使用增量式光电编码器迭代编码所提供的投入可迭代此函数是一个生成器错误(以及任何其他关键字参数) 传递到增量编码器。

新版本 2.5 中的。

codecs.iterdecode(iterable, encoding[, errors])

使用增量的解码器进行迭代解码所提供的投入可迭代此函数是一个生成器错误(以及任何其他关键字参数) 传递到增量的解码器。

新版本 2.5 中的。

本模块还提供下列常量的读取和写入平台依赖文件非常有用:

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_UTF16BOM_UTF16_BEBOM_UTF16_LE取决于平台的本机字节顺序, BOMBOM_UTF16 BOM_LE BOM_UTF16_LEBOM_BEBOM_UTF16_BE的一个别名。其他代表的物料清单中 UTF 8 以及 utf-32 编码。

7.8.1. Codec Base Classes

编解码器模块定义了一套的基类,这些类定义的接口,也可以用来轻松地编写您自己使用的编解码器在 Python 中。

每个编解码器已定义四个接口,以使它可用作编解码器在 Python 中: 无国籍的编码器,无国籍的解码器、 流读取器和流编写器。流读取器和作家通常会重用无国籍的编码器/解码器来实现文件的协议。

编解码器类定义的接口无国籍的解码器。

为了简化和标准化的错误处理, encode()decode()的方法可以实现不同的错误处理方案通过提供错误字符串参数。以下字符串值是定义和实现的所有标准的 Python 编码解码器:

Value Meaning
'strict' Raise UnicodeError (or a subclass); this is the default.
'ignore' Ignore the character and continue with the next.
'replace' Replace with a suitable replacement character; Python will use the official U+FFFD REPLACEMENT CHARACTER for the built-in Unicode codecs on decoding and ‘?’ on encoding.
'xmlcharrefreplace' Replace with the appropriate XML character reference (only for encoding).
'backslashreplace' Replace with backslashed escape sequences (only for encoding).

通过register_error(),可以扩展的允许值的集合。

7.8.1.1. Codec Objects

编解码器类定义这些方法,还定义函数接口的无国籍的编码器和解码器:

Codec.encode(input[, errors])

编码对象的输入,并返回一个元组 (输出对象,消耗的长度)。编解码器并不只局限在 Unicode 上下文中,使用 Unicode,则编码将 Unicode 对象转换为使用特定的字符集编码一个普通字符串 (例如,使用 cp1252iso 8859-1)。

错误定义错误处理申请。它默认为'严格'处理。

该方法不可能在编解码器实例中存储状态。为要保持状态,以使编码解码效率高的编解码器使用StreamCodec

编码器必须能够处理零长度的输入,并返回一个输出的对象类型的空对象,在这种情况。

Codec.decode(input[, errors])

解码对象的输入,并返回一个元组 (输出对象,消耗的长度)。在 Unicode 中,解码格式的字符串,使用一个特定的字符编码将编码设置为 Unicode 对象的转换。

输入必须是一个对象,提供bf_getreadbuf缓冲槽。Python 字符串、 缓冲区对象和内存映射文件是提供此插槽对象的例子。

错误定义错误处理申请。它默认为'严格'处理。

该方法不可能在编解码器实例中存储状态。为要保持状态,以使编码解码效率高的编解码器使用StreamCodec

解码器必须能够处理零长度的输入,并返回一个输出的对象类型的空对象,在这种情况。

IncrementalEncoderIncrementalDecoder类提供用于增量编码和解码的基本界面。解码输入不做了一个无国籍的编码器/解码器函数调用,但有多个电话到encode()/decode()方法的增量编码器/解码器。增量编码器/解码器在方法调用期间跟踪的编码解码过程。

encode()的调用的联接的输出 /decode()方法是相同的因为如果所有单项投入连在一起,这种投入是编码解码与无国籍的编码器/解码器。

7.8.1.2. IncrementalEncoder Objects

新版本 2.5 中的。

IncrementalEncoder类用于编码中多个步骤的输入。它定义了每个增量编码器必须定义要符合 Python 编解码器注册表的以下方法。

class codecs.IncrementalEncoder([errors])

一个IncrementalEncoder实例的构造函数。

所有的增量式编码器必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

IncrementalEncoder可以实现不同的错误处理方案通过提供错误关键字参数。这些参数进行预定义:

  • 'strict' Raise ValueError (or a subclass); this is the default.
  • 'ignore' Ignore the character and continue with the next.
  • 'replace' Replace with a suitable replacement character
  • 'xmlcharrefreplace' Replace with the appropriate XML character reference
  • 'backslashreplace' Replace with backslashed escape sequences.

错误参数将分配到具有相同名称的属性。分配给此属性,就可以切换不同的错误处理策略在IncrementalEncoder对象的生存期期间。

可以使用register_error()扩展的错误参数允许的值集。

encode(object[, final])

编码对象(考虑到编码器的当前状态),并返回生成的编码的对象。如果这是最后一次调用encode() 最终一定是真的 (缺省值为 false)。

reset()

将编码器重置为初始状态。

7.8.1.3. IncrementalDecoder Objects

IncrementalDecoder类用于解码中多个步骤的输入。它定义了每个增量的解码器必须定义要符合 Python 编解码器注册表的以下方法。

class codecs.IncrementalDecoder([errors])

一个IncrementalDecoder实例的构造函数。

所有增量解码器必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

IncrementalDecoder可以实现不同的错误处理方案通过提供错误关键字参数。这些参数进行预定义:

  • 'strict' Raise ValueError (or a subclass); this is the default.
  • 'ignore' Ignore the character and continue with the next.
  • 'replace' Replace with a suitable replacement character

错误参数将分配到具有相同名称的属性。分配给此属性,就可以切换不同的错误处理策略在IncrementalDecoder对象的生存期期间。

可以使用register_error()扩展的错误参数允许的值集。

decode(object[, final])

对象(考虑到解码器的当前状态) 进行解码,并返回所产生的解码的对象。如果这是最后一次调用decode() 最终一定是真的 (缺省值为 false)。如果最后是真的解码器必须完全解码输入,并必须刷新所有缓冲区。如果这不是可能的 (例如,因为不完整的字节序列末尾输入) 它必须启动错误处理就像在无国籍的情况下 (这可能会引发一个异常)。

reset()

将解码器重置为初始状态。

StreamWriterStreamReader类提供通用的工作接口,可以用于实现新的编码子很容易。请参阅encodings.utf_8为例,如何做到这一点。

7.8.1.4. StreamWriter Objects

StreamWriter类是一个编解码器的子类,并定义了以下的方法,每个流的作家必须定义要与书记 Python 编解码器兼容。

class codecs.StreamWriter(stream[, errors])

一个StreamWriter实例的构造函数。

所有写入流必须提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

必须开放供写入二进制数据的文件类似对象。

StreamWriter可以实现不同的错误处理方案通过提供错误关键字参数。这些参数进行预定义:

  • 'strict' Raise ValueError (or a subclass); this is the default.
  • 'ignore' Ignore the character and continue with the next.
  • 'replace' Replace with a suitable replacement character
  • 'xmlcharrefreplace' Replace with the appropriate XML character reference
  • 'backslashreplace' Replace with backslashed escape sequences.

错误参数将分配到具有相同名称的属性。分配给此属性,就可以切换不同的错误处理策略在StreamWriter对象的生存期期间。

可以使用register_error()扩展的错误参数允许的值集。

write(object)

写入到流编码的对象的内容。

writelines(list)

(可能通过重用的write ()方法),向流中写入的字符串串联的列表。

reset()

刷新和重置来保持状态使用的编解码器缓冲区。

调用此方法,应确保对输出数据投入允许附加的新的最新数据而无需重新扫描要恢复状态的整个流的干净状态。

除了上述方法, StreamWriter必须也继承的所有其他方法和属性从基础流。

7.8.1.5. StreamReader Objects

StreamReader类子类的编解码器,并定义了以下的方法,每个流读取器必须定义要与书记 Python 编解码器兼容。

class codecs.StreamReader(stream[, errors])

StreamReader实例构造函数。

所有流读者必须都提供此构造函数接口。他们可以自由地添加附加的关键字参数,但只有在此处定义并使用 Python 编解码器注册表。

必须开放供读取 (二进制) 数据的文件类似对象。

StreamReader可以实现不同的错误处理方案通过提供错误关键字参数。定义了这些参数:

  • 'strict' Raise ValueError (or a subclass); this is the default.
  • 'ignore' Ignore the character and continue with the next.
  • 'replace' Replace with a suitable replacement character

错误参数将分配到具有相同名称的属性。分配给此属性,就可以切换不同的错误处理策略StreamReader对象的生存期内。

可以使用register_error()扩展的错误参数允许的值集。

read([size[, chars[, firstline]]])

流中的数据进行解码,并返回生成的对象。

字符指示要从流中读取的字符数。 read ()将永远不会返回更多字符的字符,但它可能会返回较少,如果没有足够的字符可用。

大小表示要解码的目的从流中读取字节的近似的最大数目。解码器可以修改此设置为适当。默认值为-1 指示读取和解码尽可能多地。大小被为了防止不得不对一步到位的巨大文件进行解码。

一道防线指示以后线上有解码错误足以只返回第一行。

该方法应使用贪婪的阅读的策略,意味着它应该阅读尽可能多的数据被允许在定义中的编码和给定的尺寸,例如如果可选编码结局或状态标记在该流上可用,这些也应该读。

2.4 版本中的更改:添加的字符参数。

版本 2.4.2 中的更改:一道防线参数添加。

readline([size[, keepends]])

从输入流中读取一行并返回已解码的数据。

大小,如果给出,是作为大小参数传递给流的read ()方法。

如果keepends为 false 将从返回的行中去除行尾。

2.4 版本中的更改:keepends参数添加。

readlines([sizehint[, keepends]])

读取所有行上输入可用流并将它们作为行的列表返回。

行尾使用的编解码器的解码方法实现的并被列入列表条目,如果keepends为 true。

sizehint,如果给出,是作为大小参数传递给流的read ()方法。

reset()

重置来保持状态使用的编解码器缓冲区。

请注意没有流重新定位应该发生。这种方法主要是为了能够从解码错误中恢复。

除了上述方法, StreamReader必须也继承的所有其他方法和属性从基础流。

接下来两个基类是为了方便起见。他们不需要的编解码器的注册表,但可能提供有用的实践。

7.8.1.6. StreamReaderWriter Objects

StreamReaderWriter允许包的流的工作在两个读取和写入模式。

设计是这样一个可以使用lookup()函数返回工厂函数来构造实例。

class codecs.StreamReaderWriter(stream, Reader, Writer, errors)

创建一个StreamReaderWriter实例。必须是一个类似文件的对象。读者作家必须工厂函数或类提供StreamReaderStreamWriter接口和错误处理在相同的方式定义为流的读者和作家。

StreamReaderWriter实例定义组合的StreamReaderStreamWriter类的接口。从基础流,他们继承所有其他方法和属性。

7.8.1.7. StreamRecoder Objects

StreamRecoder提供的前端-后端编码处理不同的编码环境时有时是有用的数据视图。

设计是这样一个可以使用lookup()函数返回工厂函数来构造实例。

class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors)

创建一个StreamRecoder实例实现的双向转换: 前端 ( read ()write ()输出输入) 而读者作家的工作,在后端 (读取和写入到流)进行编码解码工作。

您可以使用这些对象做透明直接 recodings 从如拉丁语 1 到 UTF-8 的来回。

必须是一个类似文件的对象。

编解码器接口必须遵循编码解码读者作家必须工厂函数或类分别提供StreamReaderStreamWriter接口的对象。

前端翻译、读者作家的后端翻译需要进行编码解码所使用的中间格式是由两个集的编解码器,例如确定 Unicode 编码解码器将使用 Unicode 作为中间体的编码。

错误处理是以同样的方式界定为流的读者和作家。

StreamRecoder实例定义组合的StreamReaderStreamWriter类的接口。从基础流,他们继承所有其他方法和属性。

7.8.2. Encodings and Unicode

Unicode 字符串作为序列代码点 (要精确作为Py_UNICODE数组) 的内部存储。根据的方式编译 Python (要么通过— — 启用 unicode = ucs2— — 启用 unicode = ucs4,与前者是默认值) Py_UNICODE是任何一种 16 位或 32 位的数据类型。一旦在 CPU 和内存使用 Unicode 对象,CPU 的字节排序方式和这些阵列作为字节的存储方式成为一个问题。将 unicode 对象转换为字节序列称为编码,重新创建从字节序列的 unicode 对象被称为解码。有许多不同的方法,为这种转变可以做的事 (这些方法也称为编码)。最简单的方法是将映射代码点 0-255 到字节0x0-0xff这意味着无法对一个包含代码点以上U + 00FF的 unicode 对象进行编码,用这种方法 (即所谓' 拉丁语-1'"iso-8859-1")。 unicode.encode()将提高UnicodeEncodeError ,看起来像这样: UnicodeEncodeError: ' 拉丁语-1' 编解码器无法编码字符 u 'ሴ' 位置 3: 序号 range(256)

还有另一组的选择所有的 unicode 代码点的不同子集和如何将这些代码点映射到字节0x0-0xff的编码 (所谓的 charmap 编码)。来看看如何做到这一点只需打开如encodings/cp1252.py (这是一种编码,主要在 Windows 上使用)。那里是显示你哪个字符映射到哪个字节值与 256 个字符的字符串常数。

所有的这些编码只可以编码在 unicode 中定义的 1114112 代码点 256。简单、 直接的方式,可以将存储每个 Unicode 代码点,是作为四个连续的字节存储每个代码点。有两种可能性: 在大端或小端字节序顺序存储字节数。这两个编码分别称为UTF 32 将UTF-32-LE 他们的缺点是如果你用UTF 32 是在一个小的 endian 机器上你都要换上编码和解码的字节。 UTF 32避免了这个问题: 字节为单位) 将永远在自然的字节排序方式。当这些字节读取 CPU 与不同字节排序方式时,字节为单位) 的就有虽然换。能够检测的utf-16UTF 32字节序列的字节排序方式,还有所谓的物料清单 ("字节顺序标记")。这是U + FEFF的 Unicode 字符。这种性格可以前置到每个utf-16UTF 32字节序列。字节交换版本的这种性格 (0xfffe 开头) 是一个非法的字符,Unicode 文本可能不会出现。所以当utf-16UTF 32字节序列的第一个字符显示为U + FFFE字节不得不换上解码。不幸的是字符U + FEFF曾作为宽度无断空间的第二个目的: 有没有宽度,并且不允许使用一个单词要拆分的字符。例如,它可以用于给结扎算法的提示。以 Unicode 4.0 操作系统使用U + FEFF作为宽度无断空间已弃用 (与U + 2060年细木工) 假设这个角色)。然而 Unicode 软件还必须能够处理U + FEFF这两种角色: 作为物料清单,它是设备,以确定已编码的字节的存储布局,煦一旦成 Unicode 字符串 ; 已解码的字节序列它是一个宽度无断空间将解码像任何其他的普通字符。

还有另一种编码,能够完整范围的 Unicode 字符编码: UTF-8。UTF-8 是一种 8 位编码,这意味着没有与 utf-8 字节顺序的问题。每个字节的 utf-8 字节序列由两部分组成: 标记位 (最高有效位) 和有效载荷位。标记位为零到四1位后面0的位序列。Unicode 字符被编码为像这样 (带有 x 有效载荷位,当连接给 Unicode 字符):

Range Encoding
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字符 (即使它是第一个字符) 被视为一个宽度无中断的空间

Without external information it’s impossible to reliably determine which encoding was used for encoding a Unicode string. 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. To increase the reliability with which a UTF-8 encoding can be detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls "utf-8-sig") for its Notepad program: Before any of the Unicode characters is written to the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: 0xef, 0xbb, 0xbf) is written. As it’s rather improbable that any charmap encoded file starts with these byte values (which would e.g. map to

LATIN SMALL LETTER I WITH DIAERESIS
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
INVERTED QUESTION MARK

iso 8859-1),这增加了utf-8-康美编码可以正确地猜测从字节序列的概率。这里不使用物料清单必须能够确定用于生成的字节序列的字节顺序,但作为签名,有助于在猜测的编码。编码 utf-8-康美编解码器将写入到 0xef 之间 0xbb 0xbf作为第三个字节文件。在解码utf-8-sig将跳过那些三个字节如果它们显示为文件中的第三个字节。UTF-8,在物料清单的使用是气馁和通常应该避免。

7.8.3. Standard Encodings

Python 带有大量的编解码器内置,要么实施作为 C 函数或词典作为映射表。下表列出了由几个常见的别名,并为其编码可能使用的语言的名称的编码解码器。别名的列表既的语言的列表就是要详尽无遗。请注意只有大小写不同的或使用连字符而不是下划线的拼写替代办法也是有效的别名 ;因此,如' utf-8'是一个有效的别名'utf_8'的编解码器。

很多字符集支持相同的语言。他们各不相同,在单独的字符 (例如是否欧元符号支持与否),并分配到代码位置的字符。对于欧洲的语言特别是以下变形通常存在:

  • an ISO 8859 codeset
  • a Microsoft Windows code page, which is typically derived from a 8859 codeset, but replaces control characters with additional graphic characters
  • an IBM EBCDIC code page
  • an IBM PC code page, which is ASCII compatible
Codec Aliases Languages
ascii 646, us-ascii English
big5 big5-tw, csbig5 Traditional Chinese
big5hkscs big5-hkscs, hkscs Traditional Chinese
cp037 IBM037, IBM039 English
cp424 EBCDIC-CP-HE, IBM424 Hebrew
cp437 437, IBM437 English
cp500 EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 Western Europe
cp720   Arabic
cp737   Greek
cp775 IBM775 Baltic languages
cp850 850, IBM850 Western Europe
cp852 852, IBM852 Central and Eastern Europe
cp855 855, IBM855 Bulgarian, Byelorussian, Macedonian, Russian, Serbian
cp856   Hebrew
cp857 857, IBM857 Turkish
cp858 858, IBM858 Western Europe
cp860 860, IBM860 Portuguese
cp861 861, CP-IS, IBM861 Icelandic
cp862 862, IBM862 Hebrew
cp863 863, IBM863 Canadian
cp864 IBM864 Arabic
cp865 865, IBM865 Danish, Norwegian
cp866 866, IBM866 Russian
cp869 869, CP-GR, IBM869 Greek
cp874   Thai
cp875   Greek
cp932 932, ms932, mskanji, ms-kanji Japanese
cp949 949, ms949, uhc Korean
cp950 950, ms950 Traditional Chinese
cp1006   Urdu
cp1026 ibm1026 Turkish
cp1140 ibm1140 Western Europe
cp1250 windows-1250 Central and Eastern Europe
cp1251 windows-1251 Bulgarian, Byelorussian, Macedonian, Russian, Serbian
cp1252 windows-1252 Western Europe
cp1253 windows-1253 Greek
cp1254 windows-1254 Turkish
cp1255 windows-1255 Hebrew
cp1256 windows-1256 Arabic
cp1257 windows-1257 Baltic languages
cp1258 windows-1258 Vietnamese
euc_jp eucjp, ujis, u-jis Japanese
euc_jis_2004 jisx0213, eucjis2004 Japanese
euc_jisx0213 eucjisx0213 Japanese
euc_kr euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 Korean
gb2312 chinese, csiso58gb231280, euc- cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso- ir-58 Simplified Chinese
gbk 936, cp936, ms936 Unified Chinese
gb18030 gb18030-2000 Unified Chinese
hz hzgb, hz-gb, hz-gb-2312 Simplified Chinese
iso2022_jp csiso2022jp, iso2022jp, iso-2022-jp Japanese
iso2022_jp_1 iso2022jp-1, iso-2022-jp-1 Japanese
iso2022_jp_2 iso2022jp-2, iso-2022-jp-2 Japanese, Korean, Simplified Chinese, Western Europe, Greek
iso2022_jp_2004 iso2022jp-2004, iso-2022-jp-2004 Japanese
iso2022_jp_3 iso2022jp-3, iso-2022-jp-3 Japanese
iso2022_jp_ext iso2022jp-ext, iso-2022-jp-ext Japanese
iso2022_kr csiso2022kr, iso2022kr, iso-2022-kr Korean
latin_1 iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 West Europe
iso8859_2 iso-8859-2, latin2, L2 Central and Eastern Europe
iso8859_3 iso-8859-3, latin3, L3 Esperanto, Maltese
iso8859_4 iso-8859-4, latin4, L4 Baltic languages
iso8859_5 iso-8859-5, cyrillic Bulgarian, Byelorussian, Macedonian, Russian, Serbian
iso8859_6 iso-8859-6, arabic Arabic
iso8859_7 iso-8859-7, greek, greek8 Greek
iso8859_8 iso-8859-8, hebrew Hebrew
iso8859_9 iso-8859-9, latin5, L5 Turkish
iso8859_10 iso-8859-10, latin6, L6 Nordic languages
iso8859_13 iso-8859-13, latin7, L7 Baltic languages
iso8859_14 iso-8859-14, latin8, L8 Celtic languages
iso8859_15 iso-8859-15, latin9, L9 Western Europe
iso8859_16 iso-8859-16, latin10, L10 South-Eastern Europe
johab cp1361, ms1361 Korean
koi8_r   Russian
koi8_u   Ukrainian
mac_cyrillic maccyrillic Bulgarian, Byelorussian, Macedonian, Russian, Serbian
mac_greek macgreek Greek
mac_iceland maciceland Icelandic
mac_latin2 maclatin2, maccentraleurope Central and Eastern Europe
mac_roman macroman Western Europe
mac_turkish macturkish Turkish
ptcp154 csptcp154, pt154, cp154, cyrillic-asian Kazakh
shift_jis csshiftjis, shiftjis, sjis, s_jis Japanese
shift_jis_2004 shiftjis2004, sjis_2004, sjis2004 Japanese
shift_jisx0213 shiftjisx0213, sjisx0213, s_jisx0213 Japanese
utf_32 U32, utf32 all languages
utf_32_be UTF-32BE all languages
utf_32_le UTF-32LE all languages
utf_16 U16, utf16 all languages
utf_16_be UTF-16BE all languages (BMP only)
utf_16_le UTF-16LE all languages (BMP only)
utf_7 U7, unicode-1-1-utf-7 all languages
utf_8 U8, UTF, utf8 all languages
utf_8_sig   all languages

7.8.4. Python Specific Encodings

大量的预定义的编码解码器是特定于 Python 是一种,所以他们的编解码器名字有外 Python 没有意义。这些都是基于预期的输入和输出类型 (请注意尽管文本编码是最常见的使用情况,为编解码器,基础的编解码器支持任意数据转换,而不是只是文本编码) 以下的表格中列出。对于不对称的编解码器,所述的目的描述编码方向。

下列编码解码器提供 unicode str 编码[1]和 str unicode 解码[2],类似于 Unicode 文本编码。

Codec Aliases Purpose
idna   Implements RFC 3490, see also encodings.idna
mbcs dbcs Windows only: Encode operand according to the ANSI codepage (CP_ACP)
palmos   Encoding of PalmOS 3.5
punycode   Implements RFC 3492
raw_unicode_escape   Produce a string that is suitable as raw Unicode literal in Python source code
rot_13 rot13 Returns the Caesar-cypher encryption of the operand
undefined   Raise an exception for all conversions. Can be used as the system encoding if no automatic coercion between byte and Unicode strings is desired.
unicode_escape   Produce a string that is suitable as Unicode literal in Python source code
unicode_internal   Return the internal representation of the operand

新 2.3 版: Idnapunycode编码。

下列编码解码器提供了 str 对 str 编码和解码[2]

Codec Aliases Purpose Encoder/decoder
base64_codec base64, base-64 Convert operand to MIME base64 (the result always includes a trailing '\n') base64.b64encode(), base64.b64decode()
bz2_codec bz2 Compress the operand using bz2 bz2.compress(), bz2.decompress()
hex_codec hex Convert operand to hexadecimal representation, with two digits per byte base64.b16encode(), base64.b16decode()
quopri_codec quopri, quoted-printable, quotedprintable Convert operand to MIME quoted printable quopri.encodestring(), quopri.decodestring()
string_escape   Produce a string that is suitable as string literal in Python source code  
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]str objects are also accepted as input in place of unicode objects. They are implicitly converted to unicode by decoding them using the default encoding. If this conversion fails, it may lead to encoding operations raising UnicodeDecodeError.
[2](1, 2) unicode objects are also accepted as input in place of str objects.They are implicitly converted to str by encoding them using the default encoding. If this conversion fails, it may lead to decoding operations raising UnicodeEncodeError.

7.8.5. encodings.idnaInternationalized Domain Names in Applications

新版本 2.3。

这个模块实现了 RFC 3490 (国际化域名在应用程序中) 和 RFC 3492 (Nameprep: A Stringprep 配置文件为国际化域名名称 (IDN))。它是基于punycode编码和stringprep

这些 Rfc 一起定义的协议,支持非 ASCII 字符的域名。域名包含非 ASCII 字符 (如www.Alliancefrançaise.nu) 转换成 ASCII 兼容编码 (ACE,如www.xn--alliancefranaise-npb.nu)。在所有的地方,在那里任意字符不允许的协议,例如 DNS 查询,HTTP主机字段等等然后使用 ACE 形式的域的名称。这种转换被进行中的应用 ;用户如果可能看不见: 应用程序应透明地转换 Unicode 域标签为 IDNA 丝,并将转换回 Unicode 之前向用户提交他们的 ACE 标签。

Python 支持这种转换在几个方面: idna编解码器可以之间执行转换 Unicode 和 ACE,将输入的字符串分割成基于在3.1 节(1) 条中定义的分隔符字符的标签 RFC 3490和视需要将每个标签转换为 ACE 和相反将输入的字节字符串分隔为基于.分离器和转换成 unicode 发现任何 ACE 标签的标签。此外,套接字模块透明地转换为 Unicode 主机名 ACE,以便应用程序不需要关心转换主机名称本身,当他们将它们传递到套接字模块。在此种情况下,模块包含主机名称作为函数参数,如httplibftplib,接受 Unicode 主机名称 (httplib然后还透明地将发送 IDNA 主机名主机字段中如果它在所有发送该字段)。

当接收主机名称从导线 (如反向名称查找),没有自动转换为 Unicode 执行: 想要向用户显示这些主机名的应用程序应该向 Unicode 解码它们。

模块encodings.idna还实现了 nameprep 程序,对主机名,并统一相似字符区分大小写属性的国际域名,执行某些正火。如果需要,可以直接使用 nameprep 函数。

encodings.idna.nameprep(label)

返回标签的 nameprepped 版本。执行当前假定查询字符串,所以AllowUnassigned是真的。

encodings.idna.ToASCII(label)

将标签转换为 ASCII,如所述 RFC 3490 UseSTD3ASCIIRules假定为假。

encodings.idna.ToUnicode(label)

将标签转换为 Unicode,作为指定的 RFC 3490

7.8.6. encodings.utf_8_sigUTF-8 codec with BOM signature

新版本 2.5 中的。

这个模块实现了 UTF-8 编码解码器的 variant 类型: 对编码 utf-8 编码物料清单将预置到 UTF-8 编码的字节。状态编码器这只是一次 (在首次向字节流的形式写入)。为解码可选的 utf-8 编码的 BOM 数据的开头将被跳过。