18.1.6. email.charset
: 文字集合の表現¶
このモジュールは文字セットを表現する Charset
クラスと電子メールメッセージにふくまれる文字セット間の変換、および文字セットのレジストリとこのレジストリを操作するためのいくつかの便宜的なメソッドを提供します。 Charset
インスタンスは email
パッケージ中にあるほかのいくつかのモジュールで使用されます。
このクラスは email.charset
モジュールから import してください。
バージョン 2.2.2 で追加.
-
class
email.charset.
Charset
([input_charset])¶ 文字セットを email のプロパティに写像する。
このクラスはある特定の文字セットに対し、電子メールに課される制約の情報を提供します。また、与えられた適用可能な codec をつかって、文字セット間の変換をおこなう便宜的なルーチンも提供します。またこれは、ある文字セットが与えられたときに、その文字セットを電子メールメッセージのなかでどうやって RFC に準拠したやり方で使用するかに関する、できうるかぎりの情報も提供します。
文字セットによっては、それらの文字を電子メールのヘッダあるいはメッセージ本体で使う場合は quoted-printable 形式あるいは base64形式でエンコードする必要があります。またある文字セットはむきだしのまま変換する必要があり、電子メールの中では使用できません。
以下ではオプション引数 input_charset について説明します。この値はつねに小文字に強制的に変換されます。そして文字セットの別名が正規化されたあと、この値は文字セットのレジストリ内を検索し、ヘッダのエンコーディングとメッセージ本体のエンコーディング、および出力時の変換に使われる codec をみつけるのに使われます。たとえば input_charset が
iso-8859-1
の場合、ヘッダおよびメッセージ本体は quoted-printable でエンコードされ、出力時の変換用 codec は必要ありません。もし input_charset がeuc-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 エンコーディング)、あるいは最短の QP または BASE64 エンコーディングであるCharset.SHORTEST
に設定されます。そうでない場合、この値はNone
になります。
-
body_encoding
¶ header_encoding と同じですが、この値はメッセージ本体のためのエンコーディングを記述します。これはヘッダ用のエンコーディングとは違うかもしれません。body_encoding では、
Charset.SHORTEST
を使うことはできません。
-
output_charset
¶ 文字セットによっては、電子メールのヘッダあるいはメッセージ本体に使う前にそれを変換する必要があります。もし input_charset がそれらの文字セットのどれかをさしていたら、この output_charset 属性はそれが出力時に変換される文字セットの名前をあらわしています。それ以外の場合、この値は
None
になります。
-
input_codec
¶ input_charset を Unicode に変換するための Python 用 codec 名です。変換用の codec が必要ないときは、この値は
None
になります。
-
output_codec
¶ Unicode を output_charset に変換するための Python 用 codec 名です。変換用の codec が必要ないときは、この値は
None
になります。この属性は input_codec と同じ値をもつことになるでしょう。
Charset
インスタンスは、以下のメソッドも持っています:-
get_body_encoding
()¶ メッセージ本体のエンコードに使われる content-transfer-encoding の値を返します。
この値は使用しているエンコーディングの文字列
quoted-printable
またはbase64
か、あるいは関数のどちらかです。後者の場合、これはエンコードされる Message オブジェクトを単一の引数として取るような関数である必要があります。この関数は変換後 Content-Transfer-Encoding ヘッダ自体を、なんであれ適切な値に設定する必要があります。このメソッドは body_encoding が
QP
の場合quoted-printable
を返し、body_encoding がBASE64
の場合base64
を返します。それ以外の場合は文字列7bit
を返します。
-
convert
(s)¶ 文字列 s を input_codec から output_codec に変換します。
-
to_splittable
(s)¶ マルチバイトの可能性がある文字列を、安全に split できる形式に変換します。 s には split する文字列を渡します。
これは input_codec を使って文字列を Unicode にすることで、文字と文字の境界で (たとえそれがマルチバイト文字であっても) 安全に split できるようにします。
input_charset の文字列 s をどうやって Unicode に変換すればいいかが不明な場合、このメソッドは与えられた文字列そのものを返します。
Unicode に変換できなかった文字は、Unicode 置換文字 (Unicode replacement character)
'U+FFFD'
に置換されます。
-
from_splittable
(ustr[, to_output])¶ split できる文字列をエンコードされた文字列に変換しなおします。 ustr は "unsplit" するための Unicode 文字列です。
このメソッドでは、文字列を Unicode からエンコード形式に戻すために適切な codec を使用します。与えられた文字列が Unicode ではなかった場合、あるいはそれをどうやって Unicode から変換するか不明だった場合は、与えられた文字列そのものが返されます。
Unicode から正しく変換できなかった文字については、適当な文字 (通常は
'?'
) に置き換えられます。to_output が
True
の場合 (デフォルト)、このメソッドは output_codec をエンコードの形式として使用します。 to_output がFalse
の場合、これは input_codec を使用します。
-
get_output_charset
()¶ 出力用の文字セットを返します。
これは output_charset 属性が
None
でなければその値になります。それ以外の場合、この値は input_charset と同じです。
-
encoded_header_len
()¶ エンコードされたヘッダ文字列の長さを返します。これは quoted-printable エンコーディングあるいは base64 エンコーディングに対しても正しく計算されます。
-
header_encode
(s[, convert])¶ 文字列 s をヘッダ用にエンコードします。
convert が
True
の場合、文字列は入力用文字セットから出力用文字セットに自動的に変換されます。これは行の長さ問題のあるマルチバイトの文字セットに対しては役に立ちません (マルチバイト文字はバイト境界ではなく、文字ごとの境界で split する必要があります)。これらの問題を扱うには、高水準のクラスであるHeader
クラスを使ってください (email.header
を参照)。 convert の値はデフォルトではFalse
です。エンコーディングの形式 (base64 または quoted-printable) は、header_encoding 属性に基づきます。
-
body_encode
(s[, convert])¶ 文字列 s をメッセージ本体用にエンコードします。
convert が
True
の場合 (デフォルト)、文字列は入力用文字セットから出力用文字セットに自動的に変換されます。header_encode()
とは異なり、メッセージ本体にはふつうバイト境界の問題やマルチバイト文字セットの問題がないので、これはきわめて安全におこなえます。エンコーディングの形式 (base64 または quoted-printable) は、body_encoding 属性に基づきます。
Charset
クラスには、標準的な演算と組み込み関数をサポートするいくつかのメソッドがあります。-
__str__
()¶ input_charset を小文字に変換された文字列型として返します。
__repr__()
は、__str__()
の別名となっています。
-
また、 email.charset
モジュールには、グローバルな文字セット、文字セットの別名(エイリアス) および codec 用のレジストリに新しいエントリを追加する以下の関数もふくまれています:
-
email.charset.
add_charset
(charset[, header_enc[, body_enc[, output_charset]]])¶ 文字の属性をグローバルなレジストリに追加します。
charset は入力用の文字セットで、その文字セットの正式名称を指定する必要があります。
オプション引数 header_enc および body_enc は quoted-printable エンコーディングをあらわす
Charset.QP
か、base64 エンコーディングをあらわすCharset.BASE64
、最短の quoted-printable または base64 エンコーディングをあらわすCharset.SHORTEST
、あるいはエンコーディングなしのNone
のどれかになります。SHORTEST
が使えるのは header_enc だけです。デフォルトの値はエンコーディングなしのNone
になっています。オプション引数 output_charset には出力用の文字セットが入ります。
Charset.convert()
が呼ばれたときの変換はまず入力用の文字セットを Unicode に変換し、それから出力用の文字セットに変換されます。デフォルトでは、出力は入力と同じ文字セットになっています。input_charset および output_charset はこのモジュール中の文字セット-codec 対応表にある Unicode codec エントリである必要があります。モジュールがまだ対応していない codec を追加するには、
add_codec()
を使ってください。より詳しい情報についてはcodecs
モジュールの文書を参照してください。グローバルな文字セット用のレジストリは、モジュールの global 辞書
CHARSETS
内に保持されています。
-
email.charset.
add_alias
(alias, canonical)¶ 文字セットの別名 (エイリアス) を追加します。alias はその別名で、たとえば
latin-1
のように指定します。canonical はその文字セットの正式名称で、たとえばiso-8859-1
のように指定します。文字セットのグローバルな別名用レジストリは、モジュールの global 辞書
ALIASES
内に保持されています。