Message::* Perl modules の文字コードの扱い

手っ取り早く日本語が使えるようにする方法

日本語文字コード変換に良く使われる、 jcode.plJcode.pm, NKF.pm などを使うための定義モジュールを用意しています。これを次の例のように use するだけで使えます。

## どちらか好きな方をどうぞ。
use Message::MIME::Charset::Jcode 'Jcode';	## 'Jcode.pm' と書いても良い。
use Message::MIME::Charset::Jcode 'jcode.pl';

jcode.pl や Jcode.pm などは、自動的に require/use されます。

ちなみに、複数回 Message::MIME::Charset::Jcode を読み込んだ場合には最後の定義が有効になります。また、 (当然といえば当然ですが) そのモジュールで利用可能な charset のみ定義されます。ですから、上の例の通りの順番で書いておくことで、 UTF-8 は Jcode.pm で、それ以外の場合は jcode.pl で変換が行われます。

なお、内部文字コード (メソッドなどで値を取り出した時の符号化方式) は、変換モジュールの内部コードまたは日本語 EUC になります。 (jcode.pl や Jcode.pm では日本語 EUC です。) これを変更するには、 $Message::MIME::Charset::Jcode::CODE{internal}'sjis''jis' (7ビット ISO/IEC 2022) などにして下さい。

Charset の定義

既定の状態では、本文や quoted-string などの部分について、文字コードに関係する変換処理は行われません。 Perl のファイル入出力などがそうであるように、単なる8ビットのオクテット列として扱います。

文字コードの変換処理 (メッセージの符号化文字集合から script 内部の符号化文字集合への変換と、その逆) を定義するには、 Message::MIME::Charset::make_charset を使います。利用例は Message::MIME::Charset::Jcode を見て下さい。

*default は特別な charset で、 MIME などで charset が指定されていない、 quoted-string の変換処理を定義します。 (なお、一般に charset 名は、 Message::* 各モジュールでは小文字に正規化した状態で処理しますから、こうした charset 定義は小文字で行います。)

この charset 定義は、当然、当該処理が呼び出される前に行っておく必要があります。 Message::Entity->parse などする前に 定義しておくと良いでしょう。

Charset 定義の name_minimumizer 属性は、名前最小化の関数を指定します。 MIME によると charset 名は、使用されている文字の範囲の最小公倍数的なものにする必要があります。 (例えば、基本ラテン文字のみからなる ISO-2022-JP は、名前を最小化して US-ASCII としなければなりません。)

なお、 ISO-2022-JP など幾つかの charset 用には Message::MIME::Charset で組み込み定義されていますので、改めて指定する必要はありません。

内部実装についての覚書

文字回りは実装した本人すら何がなんだか良くわかりません。 元々色々な仕様や慣習が入り混じってる部分なので、綺麗な実装は不可能かもしれません。

encoding_before_decode は復号前 (の生メッセージ) の charset, encoding_after_encode は符号化後 (の生メッセージ) に charset。通常は同じ値にしますが、 EUC-JP (擬似) RFC 822 から ISO-2022-JP RFC 822 に変換するような時に使えます (かも)。 (でも *default charset の変換処理側で細工した方が楽。)

両 encoding_* option には、 *default (擬似) charset を指定できます。ほとんどの module ではこれが既定値です。 HTTP に使うときはこれを ISO-8859-1 に変えたりします。

header_default_charset, body_default_charset は、 *default (擬似) charset の IANA charset 名。 暗黙指定 charset を明示する必要が出た時 (Content-Type: 領域の付与, RFC 2231 符号化などの時) に使われます。

*default charset は charset 名札がない文字列に仮定されます。 媒体型の charset パラメーターや encoded-word や RFC 2231 で charset 名が明示されている時には、そちらの charset 名が使われます。

header_default_charset_input, body_default_charset_input は、 encoding_before_decode の値が *default の時の、その IANA charset 名を指定します。 通常は読み込み時に内部文字集合に変換しますが、この input charset から内部文字集合に変換出来ない場合、 そのまま無変換で保持します。これを出力する場合で charset 名が必要になった時に、 (本来なら encoding_after_encode を使い、その値が *default の時は更に *_default_charset の値を使うのですが、 変換不能な charset からそれへは変換出来ないので、) input charset をそのまま出力し、この名前を使います。

将来計画

$Date: 2003/09/04 02:19:22 $