email.charset:表示字符集

源代码: Lib/email/charset.py


此模块是旧版 (Compat32) email API 的一部分。在新 API 中,仅使用别名表。

本节其余文本是模块的原始文档。

此模块提供了一个类 Charset,用于表示电子邮件消息中的字符集和字符集转换,以及字符集注册表和一些用于操作此注册表的便捷方法。Charset 的实例在 email 包中的其他几个模块中使用。

email.charset 模块导入此类。

class email.charset.Charset(input_charset=DEFAULT_CHARSET)

将字符集映射到它们的电子邮件属性。

此类提供有关电子邮件对特定字符集施加的要求的信息。它还提供了在适用编解码器可用时在字符集之间进行转换的便捷例程。给定一个字符集,它将尽力提供有关如何在符合 RFC 的电子邮件消息中使用该字符集的信息。

某些字符集在电子邮件标头或正文中使用时必须使用 quoted-printable 或 base64 进行编码。某些字符集必须完全转换,并且不允许在电子邮件中使用。

可选的 input_charset 如下所述;它始终被强制转换为小写。在别名规范化之后,它还用作字符集注册表中的查找,以找出要用于该字符集的标头编码、正文编码和输出转换编解码器。例如,如果 input_charsetiso-8859-1,则标头和正文将使用 quoted-printable 进行编码,并且不需要输出转换编解码器。如果 input_charseteuc-jp,则标头将使用 base64 进行编码,正文将不进行编码,但输出文本将从 euc-jp 字符集转换为 iso-2022-jp 字符集。

Charset 实例具有以下数据属性

input_charset

指定的初始字符集。常用别名会转换为它们的官方电子邮件名称(例如,latin_1 会转换为 iso-8859-1)。默认为 7 位 us-ascii

header_encoding

如果必须先对字符集进行编码才能在电子邮件标头中使用,则此属性将设置为 charset.QP(用于 quoted-printable)、charset.BASE64(用于 base64 编码)或 charset.SHORTEST(用于 QP 或 BASE64 编码中最短的)。否则,它将为 None

body_encoding

header_encoding 相同,但描述邮件消息正文的编码,这实际上可能与标头编码不同。不允许 body_encoding 使用 charset.SHORTEST

output_charset

某些字符集必须先转换才能在电子邮件标头或正文中使用。如果 input_charset 是其中之一,则此属性将包含输出将转换为的字符集的名称。否则,它将为 None

input_codec

用于将 input_charset 转换为 Unicode 的 Python 编解码器的名称。如果不需要转换编解码器,则此属性将为 None

output_codec

用于将 Unicode 转换为 output_charset 的 Python 编解码器的名称。如果不需要转换编解码器,则此属性将具有与 input_codec 相同的值。

Charset 实例还具有以下方法

get_body_encoding()

返回用于正文编码的内容传输编码。

这要么是字符串 quoted-printablebase64(取决于使用的编码),要么是一个函数,在这种情况下,您应该使用一个参数(即正在编码的 Message 对象)调用该函数。然后,该函数应将 Content-Transfer-Encoding 标头本身设置为适当的值。

如果 body_encodingQP,则返回字符串 quoted-printable;如果 body_encodingBASE64,则返回字符串 base64;否则返回字符串 7bit

get_output_charset()

返回输出字符集。

如果 output_charset 不是 None,则此属性为 output_charset 属性;否则为 input_charset

header_encode(string)

对字符串 string 进行标头编码。

编码类型(base64 或 quoted-printable)将基于 header_encoding 属性。

header_encode_lines(string, maxlengths)

通过先将字符串转换为字节来对字符串进行标头编码。

这类似于 header_encode(),不同之处在于,该字符串会适应由参数 maxlengths 给出的最大行长度,该参数必须是迭代器:从此迭代器返回的每个元素都将提供下一个最大行长度。

body_encode(string)

对字符串 string 进行正文编码。

编码类型(base64 或 quoted-printable)将基于 body_encoding 属性。

Charset 类还提供了许多方法来支持标准操作和内置函数。

__str__()

返回 input_charset 作为强制转换为小写的字符串。__repr__()__str__() 的别名。

__eq__(other)

此方法允许您比较两个 Charset 实例是否相等。

__ne__(other)

此方法允许您比较两个 Charset 实例是否不相等。

email.charset 模块还提供了以下函数,用于向全局字符集、别名和编解码器注册表添加新条目

email.charset.add_charset(charset, header_enc=None, body_enc=None, output_charset=None)

向全局注册表添加字符属性。

charset 是输入字符集,并且必须是字符集的规范名称。

可选的 header_encbody_enc 可以是 charset.QP (用于 quoted-printable 编码),charset.BASE64 (用于 base64 编码),charset.SHORTEST (用于 quoted-printable 或 base64 编码中最短的编码),或 None (不进行编码)。SHORTEST 仅对 header_enc 有效。默认值为 None,表示不进行编码。

可选的 output_charset 是输出应采用的字符集。当调用 Charset.convert() 方法时,转换将从输入字符集进行到 Unicode,再到输出字符集。默认情况下,输出的字符集与输入字符集相同。

input_charsetoutput_charset 都必须在模块的字符集到编解码器映射中具有 Unicode 编解码器条目;使用 add_codec() 来添加模块不知道的编解码器。有关更多信息,请参见 codecs 模块的文档。

全局字符集注册表保存在模块全局字典 CHARSETS 中。

email.charset.add_alias(alias, canonical)

添加字符集别名。alias 是别名,例如 latin-1canonical 是字符集的规范名称,例如 iso-8859-1

全局字符集别名注册表保存在模块全局字典 ALIASES 中。

email.charset.add_codec(charset, codecname)

添加一个编解码器,该编解码器将给定字符集中的字符映射到 Unicode,并从 Unicode 映射回来。

charset 是字符集的规范名称。codecname 是 Python 编解码器的名称,适用于 strencode() 方法的第二个参数。