タイトルMac OS XのMailは日本語の件名のエンコード処理にバグ、メーリングリストで問題カテゴリー電子メール
作成日2001/9/14 18:53:1作成者新居雅行
Mac OS Xに付属の電子メールソフトMailは、機能的にも十分なので、すでに使っている人も多いかもしれない。しかしながら、Mailで件名(Subject)に日本語の文字列を記述した場合、そこでのデータ変換処理に問題があることが判明している。ただ、その結果、件名が送信先で見えないという症状が出ているわけではないものの、いくつかの問題を引き起こしている。1つは、fmlのような高機能なメーリングリストサーバソフトを経由してメール配信を行う場合、受信して配信するメールにおいて件名をきちんと表示されなくなるという点だ。fmlは単にメールをそのままたくさんのアドレスに転送するのではなく、内容を取り出し、たとえば件名にメーリングリスト名や番号などを付加するなどの処理を行う。そこで、データ構造の解釈が厳密なために、正しく変換されていないMailによるメールの件名が文字化けなどの結果となって配信されてしまうのである。fml関連のメーリングリストで、そのことが詳細に報告されている。

◇Re: apple mail利用時にサブジェクトが文字化けする
 http://mikoto.sapporo.iij.ad.jp/~fukachan/mlarchives/fml-help/msg00853.html

こうした結果となる原理についてもこの機会に解説しておこう。何気なく使っている電子メールであるが、送受信時にはさまざまな変換処理が行われる。件名に限って言えば、次のような変換処理を行う。まず、電子メールソフトで入力した日本語の件名は、通常はJISコードでの表現にまず変換される。そのJISコード変換の結果を、さらにbase64という手法でコード化する。base64は1バイト文字のアルファベットと数字および一部の記号だけで構成されるものである。ここで、メールソフトでメールのソース、つまり実際に送られてきたメールそのものが参照できるのなら、Subject: で始まる行を見てほしい。日本語の部分で、「=?iso-2022-jp?B?」とあり、続けて暗号のような記号が並んでいるが、これは以後のテキストは“JISコードで記述した文字列”を“base64”でエンコードしたということを示している。そして、受信側では逆に、base64のエンコード結果からデコードを行い、たとえばJISコードでの文字列を得る。それをさらに、UNICODEとかShift-JISコードなどアプリケーションで必要な形式のコードに変換をして、利用者に見せるという具合だ。もっとも、こうした手法は原則であって、メールソフトごとにやり方が違う。たとえば、1バイトで表現できるコードをbase64の中に入れるのか入れないのかなどなど、実は処理がまちまちだったりする。さらに、base64以外にQuotedPrintableというエンコード方式がある。「=?iso-20220-jp?Q?」で始まり、=に続いて文字コードを16進表現で示す形式となる。base64をサポートしていないということはないのだが、QuotedPrintableをサポートしていないメールソフトがいくらかあるようで、メーリングリストにこの形式で流すと「文字化けして読めません」と言われることもよくある。たった1行の件名でも、こうした複雑な処理をメールの送受信で行っているのである。
Mac OS XのMailは、JISコードの文字列をbase64でのエンコードを行うものの、エンコード結果が正しく行われていない模様だ。Mailでのエンコード結果から解釈すると、余分なコードが入っていたり、あるいは必要なコードが抜けていたりといったことが見られるのは、前記のメーリングリストの文書で詳しく解説されている。ところが、クライアントで使う電子メールソフトの場合、不要なコードの無視などを行うとすると、正しく行われていないエンコード結果の件名でも、結果的に正しく表示されてしまうということにもつながる。そのため、問題が重要視されないということにもつながるかもしれない。fmlのようなサーバで稼動するソフトウエアでの問題が表面化しているが、結果的にはMac OS X利用者だけでなく、Windowsを含む多くのユーザに対して「文字化け」をさせる結果になっている。fmlの改良で対処するということにも着手しているが、やはりMailの動作を正しくするということが望まれるところだ。
なお、Mac OS Xにも含まれるfetchmailによってデコードを行う場合も、Mailから送られたメールについては同様にデコード時におかしな文字列が混在してしまう。fetchmailはUNIX系OSでは一般的に含まれているコマンドで、メールをPOPサーバなどからダウンロードするためのものだ。「no mimedecode」というオプションを利用してデコードを別のプロセスに任せることになるだろう。

base64:アルファベットの大文字小文字、数字、スラッシュ、プラスの64種類のキャラクタを用いてエンコードする方法。元の文字列などから3バイト取り出すと24ビットであるが、それを4つに分割する。すると、6ビットのデータが4つ得られる。その1つ1つについて、64種類のキャラクタのいずれかを割り当てることで、たとえば漢字を含む文字列なども64種類の1バイト文字だけの文字列になる。受信した側は逆の処理を行って、元の文字列を得ることができる。件名のエンコードだけでなく、添付ファイルのエンコードにも広く使われている方式である。
関連リンク