はじめに
電子メール添付の日本語ファイル名の名前の後半が化ける現象が確認されました。
ファイル名の後半が化けます。前半は正常です。
確認するとiOS内蔵のメールリーダーで受信したときに化けるようです。(機材の都合でiPadOSで動作確認してます。)
送信メールリーダー(JISで送信):
Sylpheed 3.7.0 (Windows10)
DeepMail (Webメール。バージョン不明。)
受信メールリーダー:
iOS内蔵メール (iPadOS 14.6)
ファイル名の例
正常に表示:
「一二三四五.docx」
文字化けする例:
「一二三四五六.docx」
「一二三四五六七.docx」
「一二三四五六七八.docx」
「算算算算算算算算算算算算算算算算算算.docx」
日本語の6文字目(付近)から化けるようです。(DeepMailはだいたい6文字が限界。Sylpeedは6文字以上行ける場合が多い。)
なお、Mew6.8で送信すると化けません。
補足: Mewは拡張子がtxtだと属性がinlineになりiOS内蔵メールでは引用形式で表示されるためファイル名が見えないので、Mewで送信を試す時はMS-Word(拡張子docx)とかにしてください。属性がattachmentになります。
テキスト(txt)の時。
Content-Type: Text/Plain; charset=iso-2022-jp;
name="xxxxx.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="xxxxx.txt"
MS-Word(docx)の時。
Content-Type: Application/Vnd.openxmlformats-Officedocument.wordprocessingml.document;
name="xxxxx.docx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="xxxxx.docx"
どんな感じで化けるか
どうも6文字目(付近)以降のJIS相当のASCIIコードが見えるようです。
サンプルファイル名「算算算算算算算算算算算算算算算算算算.docx」としますが、こんな感じ「算算算算算;;;;(一部省略);;;;.doc」になります。
なお、「算」はJISコードが「;;」です。
原因(AppleMailのバグ)
試行錯誤した範囲ですが、おそらくこれが原因です。
ファイル名「算算算算算算算算算算算算算算算算算算.docx」はRFC2231形式にのっとり以下のようにASCIIコードに変換されます。
Content-Disposition: attachment;
filename*0*=ISO-2022-JP''%1B%24B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B;
filename*1*=%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B;
filename*2*=%3B%3B%1B%28B.docx
ここで改行が入ったところから化けるようです。AppleMail(iOS)のバグです。
Mew6.8は化けません。何故かと調べたら、Mewは改行してませんでした。
Content-Disposition: attachment;
filename*=iso-2022-jp''%1B%24B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%3B%1B%28B%2Edocx
偶然Mewはバグを回避していたにすぎないです。
しかし、Mewの挙動に驚いたのですが、長さ制限とかないのでしょうか?
追記: 最大998文字だそうだ。ただし78文字が推奨。
http://www.t-net.ne.jp/~cyfis/rfc/mail/rfc2822_ja-1.html#INDEX_2_1_1
追記2: 冒頭で「DeepMailはだいたい6文字が限界。Sylpeedは6文字以上行ける場合が多い。」と述べたがRFC2231形式に変換する規則の違いです。DeepMailはアルファベットも含めて16進数(%nn)に変換します。Sylpeedはアルファベットはそのままになります。記号のみ16進数(%nn)に変換します。そのため若干短くなり、改行(文字化け)するまで余裕が出ます。
追記3: ファイル名がRFC2231ではなくBエンコーディングの場合はファイル名(filename="=?ISO-2022-JP?B?....")が長くても改行しないのが正しい。
http://www.emaillab.org/essay/japanese-filename.html
参考文献
https://www.atmarkit.co.jp/ait/articles/0104/10/news002.html
https://www.mew.org/~kazu/doc/newsletter/3.html
http://www.emaillab.org/essay/japanese-filename.html#rfc2231
追記: JISコードのエスケープシーケンス
JISコードの開始エスケープは「ESC $ B」です。RFC2231だと「%1B%24%42」もしくは、Bはそのままにして「%1B%24B」です。
終了エスケープは「ESC ( B」です。RFC2231だと「%1B%28%42」もしくは「%1B%28B」です。
参考文献
http://x0213.org/wiki/wiki.cgi?page=%A5%A8%A5%B9%A5%B1%A1%BC%A5%D7%A5%B7%A1%BC%A5%B1%A5%F3%A5%B9
以上です。