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-bit us-ascii

header_encoding

如果字元集在用於電子郵件標頭之前必須進行編碼,此屬性將被設定為 charset.QP (表示 quoted-printable)、charset.BASE64 (表示 base64 編碼),或 charset.SHORTEST (表示 QP 或 BASE64 中較短的一種編碼)。否則,它將是 None

body_encoding

header_encoding 相同,但描述的是郵件正文的編碼,它可能與標頭編碼不同。charset.SHORTEST 不允許用於 body_encoding

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,則返回該屬性,否則返回 input_charset

header_encode(string)

對字串 string 進行標頭編碼。

編碼型別 (base64 或 quoted-printable) 將基於 header_encoding 屬性。

header_encode_lines(string, maxlengths)

透過先將 string 轉換為位元組串,再對其進行標頭編碼。

這類似於 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() 方法的第二個引數。