日本語の添付ファイル名のエンコーディング
- メールの添付ファイル名をめぐる問題について、Mac OS Xユーザの視点でまとめてみる。
- 添付ファイルを送信する際、その名前はどこに書かれるのか。RFC 2183では、添付ファイル名はContent-Dispositionフィールドのfilenameパラメータに記述することになっている。ただし今回調べたメーラーまたはメールサービスはすべて、filenameパラメータだけでなく、Content-Typeフィールドのnameパラメータにも添付ファイル名を記述する。後述するが、nameパラメータは互換用として機能している。
- 添付ファイルを送信する際、その名前はどのような方法でエンコードされるか。非ASCII文字列を添付ファイル名として扱う方法は、RFC 2231で定義されている。しかし、OutlookやWindows MailなどはRFC 2231をサポートしておらず、代わりにMIME Bエンコーディング*1を用いる*2。
- filenameパラメータとnameパラメータ、RFC 2231とMIME Bエンコーディングの組み合わせは、2×2で4通り考えられるが、現実には2通りの組み合わせに収束している。「filenameは2231、nameはB」と「filenameもnameもB」だ。
- 下図はThunderbird(3.0.4 for Mac)から送信したメッセージの一部*3。ファイル名は「あいうえおあいうえおあいうえお.png」。緑地のfilenameパラメータはRFC 2231方式で、黄色地のnameパラメータはMIME Bでエンコードされている。
- 下図は、受信したメールの添付ファイルのデコードについてまとめたもの。今回テストしたすべてのメーラーまたはメールサービスがMIME Bのデコードに対応している。エンコードにRFC 2231を用いるApple MailとThunderbirdがそのデコードに対応しているのは当然*4。Gmailはエンコードにおいては「filenameもnameもB」派だが、RFC 2231のデコードもサポートしている。OutlookやWindows MailはRFC 2231でエンコードされた(filemaneパラメータの)ファイル名をデコードできないが、その場合、nameパラメータから添付ファイル名を得ることとなる。
*1:MIME BエンコーディングはRFC 2047で定義されている。ただしRFC 2047は、Content-TypeフィールドやContent-DispositionフィールドのパラメータにMIME Bエンコーディングを用いることを禁止している。
*2:これ以外に、ISO-2022-JPの(生の)文字列を用いる例(Mac OS X 10.4.6以前のApple Mailが送信したメッセージのnameパラメータなど)もあるが、たぶん現在では一般的ではない。
*3:Thunderbirdでは、添付ファイル名の記述方法はカスタマイズすることが可能だが、このエントリでThunderbirdに言及する場合、3.0.4のデフォルトの設定(mail.strictly_mime.parm_folding=1)を前提としている。
*4:Apple MailとThunderbirdでは、RFC 2231のサポート方法に若干の違いがあって、それが文字化けの原因となるのだが、詳しくは後日。