maito で件名や本文を設定した場合の文字化け回避策

maito で件名や本文を設定したリンクをつくる場合に文字化けが起こりやすい。
環境を限定すれば難しくはないが、MacWindows で共通に使えるものをつくりたい。またブラウザーメーラーの組合せは以下の全てで動作することを目標とする。

  1. Safari + Mail(Mac
  2. Firefox + Mail(Mac
  3. Firefox + GmailMac
  4. IE + Outlook ExpressWindows
  5. Firefox + Outlook ExpressWindows
  6. Firefox + GmailWindows

まず HTML の文字コードをどうするか。これについては Shift_JIS が一番やりやすい。
HTML を Shift_JIS にして、mailto の subject、body に日本語の内容を入れた場合、改行を %0D%0A に置換しておけば上記リストの1と5以外では問題なかった。

1と5の場合の不具合はそれぞれ以下の通り。

  • 1の場合:Mail への件名、本文の挿入、送信までは問題ないが、送信先が携帯の場合に限って件名だけが文字化けした(件名が「=?CP932?Q?=96L=03c_・・・」のような文字列になってしまう)
  • 5の場合:mailto のリンクをクリックした際に Outlook Express に挿入される件名、本文が文字化けしてしまう

OS やブラウザーの判定は可能だが、送信に使うメーラーを知ることは原理的に不可能なため、5の場合のようなメーラー依存の不具合を解消するには、メーラー毎にそれぞれリンクを設けてユーザーに選択してもらうしかないだろう。

1の場合(Safari + Mail, on MacOSX)の文字化け対策

maito の subject、body に渡す文字列を、予め UTF-8 で urlencode しておけばよい。これで携帯に送信した場合も PC に送信した場合も文字化けしなくなった。この方法では、6の場合(Firefox + Gmail, on Windows)でも問題は起こらなかった。したがって、この方法が有効なのは、1,2,3,6 のケース。

5の場合(Firefox + Outlook Express, on Windows)の文字化け対策

maito の subject、body に渡す文字列を、予め SJIS で urlencode しておけばよい。この方法が有効なのは、4,5 のケース。ただし、 SJIS で urlencode すると改行コードが変換されないようなので、urlencode する前に 「\r」を「\r\n」に変換しておいてやる必要がある。

また URL エンコードPHP で行う場合、urlencode 関数の代わりに rawurlencode 関数を使うことで、半角スペースが「+」に変換されてしまうことを防ぐことができる。

まとめ

  • Mac の場合は、1,2,3 のケースとも maito の subject、body に渡す文字列を、予め UTF-8 で urlencode しておけばよい。したがってブラウザーを判定してコードを変えたりする必要はない。
  • Windows の場合、4,5 のケースと 6 のケースでは対策が異なるが、これはブラウザーではなく使っているメーラーに依存するので、ユーザーに対して2つのリンクを表示して選択してもらうしかないだろう。