続 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かな。