一見マトモなISO-2022-JPメールがmacOS Mail.appで文字化けするやつ


MIME-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

なヘッダーでボディも一見問題なくエンコードされているにも関わらず、macOS付属のMail.appで文字化けするメールを受け取るケースがある。いったい何が起こっているのか?

調査結果

文字化けが発生する条件

  1. メールの最終文字までが日本語
  2. メールの最終文字(日本語)の行末でASCIIへ復帰するエスケープシーケンスが含まれていない
  3. 日本語の文字数が500文字前後以上
  4. Message-IDからJavaMailが発信したと類推できるメール

環境依存文字の有無は関係なく2番が肝。メールの最終行でASCIIに復帰させる手続きが何故か漏れている。通常必要なエスケープシーケンス \x1B\x28\x24("ESC ( B") を付与すると文字化けせずに表示できるようになる。また3番はわりと興味深くて、文字数が少ないと文字化けは発生しなかった。
ってかさ、最後のやつがオチじゃん?予想では「最終行を改行していないStringをencodeしたら最後のASCIIへの復帰が漏れちゃった」のではないかと思ってみたが、本当のところは知らない。

該当する実装を使っている事業者の皆様におかれましては再確認をよろしくお願い申し上げます。具体的には日本郵便。