練習帳@blog

これからは写真中心で行きたい

続 EMAIL_FLAW_MIME_TAG_OVERFLOW

EMAIL_FLAW_MIME_TAG_OVERFLOW - 練習帳の追記。

上記記事では、AL-MailでEMAIL_FLAW_MIME_TAG_OVERFLOWのチェックにかからないファイル名として「拡張子以外全部全角」のファイル名について考えたが、間に若干の半角文字が挟まると挙動がガラッと変わってしまうことが分かったので追記。


AL-Mailでは、添付ファイルの名前に全角文字が入っていれば問答無用でBエンコードのencoded-wordにしてしまう。このとき拡張子以外の部分が全部全角であれば、41文字までOKなのだ。

が、途中にASCII文字が入るとおかしくなる。これはJISコードの特性のためだ。

JISコードは、基本的に【JISコード開始エスケープシーケンス】JISコード【JISコード終了エスケープシーケンス】という形をとる。
全部全角であれば、このエスケープシーケンスは最初と最後(encoded-wordにした場合は、76文字以内に改行された各行の最初と最後)にしか入らないが、途中にASCII文字が挟まると、そのつどASCII文字の前後にエスケープシーケンスが挟まることになる。

つまりこういうこと

元文字列 JISコードのバイナリ16進
じゅげむじゅげむ 1B 24 42 24 38 24 65 24 32 24 60 24 38 24 65 24 32 24 60 1B 28 4A
Aじゅげむじゅげむ 41 1B 24 42 24 38 24 65 24 32 24 60 24 38 24 65 24 32 24 60 1B 28 4A
じAゅげむじゅげむ 1B 24 42 24 38 1B 28 4A 41 1B 24 42 24 65 24 32 24 60 24 38 24 65 24 32 24 60 1B 28 4A
じゅげむじゅげむA 1B 24 42 24 38 24 65 24 32 24 60 24 38 24 65 24 32 24 60 1B 28 4A 41
AじBゅCげDむEじFゅGげHむI 41 1B 24 42 24 38 1B 28 4A 42 1B 24 42 24 65 1B 28 4A 43 1B 24 42 24 32 1B 28 4A 44 1B 24 42 24 60 1B 28 4A 45 1B 24 42 24 38 1B 28 4A 46 1B 24 42 24 65 1B 28 4A 47 1B 24 42 24 32 1B 28 4A 48 1B 24 42 24 60 1B 28 4A 49

強調された部分がエスケープシーケンス。

つまり全角文字からASCII文字に切り替わるたびに、正味の文字数よりも6バイトづつ増えてしまうのだ。だから1文字ごとに全角と半角英数が混在するような場合は、極端に送信可能文字数が少なくなる。

こういう場合では、以下のような32バイト+4バイト程度のファイル名であっても

じBゅCげDむEじFゅGげHむIごJこKう.txt

変換すると

	name="=?ISO-2022-JP?B?GyRCJDgbKEJCGyRCJGUbKEJDGyRCJDIbKEJEGyRCJGAbKEJF?=
 =?ISO-2022-JP?B?GyRCJDgbKEJGGyRCJGUbKEJHGyRCJDIbKEJIGyRCJGAbKEJJ?=
 =?ISO-2022-JP?B?GyRCJDQbKEJKGyRCJDMbKEJLGyRCJCYbKEIudHh0?="

という風に、195バイトもの長さになってしまう。これでもAL-Mailが各encoded-word行の最後にASCII文字が来るように折り返しているので、全角半角の1セット分得しているのだが。


というわけで、結論としては

「ファイル名は全部全角文字にしたうえで42文字以内とすること」

で、FAかな。