文字化けメール

DELL にユーザー登録したらメールが送られてきたんですが、そのメールが文字化けしてました。

文字化けメール研究家としては解析せざるを得ません。

メーラーで見ると Subject が次のようになっていました。

デルアカウントに$4EPO?$$$?$@$-!"$"$j$,$H$&$4$6$$$^$9!

メールのソースを見ると次のようになっていました。

Subject: =?iso-2022-jp?Q?=1B=24B=25G=25k=25=22=25=2B=25=26=25s=25H=24K?=
 =?iso-2022-jp?Q?=244EPO=3F=24=24=24=3F=24=40=24=2D=21=22=24=22=24j=24?=
 =?iso-2022-jp?Q?=2C=24H=24=26=244=246=24=24=24=5E=249=1B=28B=21?=

この Subject の Q エンコーディング文字列をデコードすると次のようになります。(\e は ESC (0x1B))

\e$B%G%k%"%+%&%s%H$K
$4EPO?$$$?$@$-!"$"$j$
,$H$&$4$6$$$^$9\e(B!

この3行を連結すると、ISO-2022-JP で「デルアカウントにご登録いただき、ありがとうございます!」となります。 つまり文字を構成するデータとしては正しいです。

ではなんで文字化けしているかというと、この Subject の記述は2つの点で間違っているためです:

その1

ISO-2022-JP は ASCII と日本語をエスケープシーケンスによって切り替えるエンコーディングです。\e$B で日本語に切り替え、\e(B で ASCII に切り替えます。 MIME エンコーディングではエンコーディングデータの文字セットは ASCII であると定められています。 1行目の先頭は \e$B なので、以降のデータは日本語になりますが、2行目と3行目のエンコーディング文字列には \e$B がないため、ASCII のままです。 そのため、「$4EPO?$$$?$@$-!"$"$j$〜」という文字列が ASCII のまま表れています。

その2

では、2行目、3行目が \e$B で始まっていたらよいかというとまだダメです。 2行目の末尾の $ は「が」の1バイト目、3行目の先頭の , は「が」の2バイト目で、1文字が別のエンコーディングデータに分かれてしまっています。 MIME エンコーディングは文字単位で行う必要があり、文字が分かれてはいけません。

というわけで、メールヘッダのエンコーディングは複雑です。早く RFC6530 が普及して UTF-8 文字がそのままヘッダに書ける世の中になればいいですね。

(その2に続く)