tiger

2013.02.24

PHPでJIS以外の文字を文字化けせずに日本語メールを送る方法

こんにちわ。花粉の季節が近づいてきてビクビクしている高橋です。

ちょっとタイトルが長くなってしまいましたが今回はメールの文字化けについて書きたいと思います。

最近では日本語のメールをUTF8で送るサービスも多くなってきたと思いますが、
まだまだJISで送る方が主流だと思います。
JISで送っているのでJISで扱っていない文字は当然文字化けします。
しかし、世の現場にはこんな会話が繰り広げられていることでしょう。

「このメールの”①”ってところが文字化けってんだけど」

「日本語のメールはJISって文字コードで送ってましてー
それJISで扱ってない文字なんで文字化けちゃうのしょうがないですねー」

「GmailとかAmazonのメールではそういう文字送れてるけど?」

「(ほんとだ、ゔぅ)なんででしょうね、ハハハ…」

日本語のメールはJISで送るというのがスタンダードで、本来はJISで扱っていない文字が
化けてしまうのは「仕様です」で済ませられたはずが文字化けせずに送れている
サービスが存在しちゃってます。
これは困りましたね。

文字化けしないで送るカラクリ

メールのヘッダにはこのメールはどの文字コードで作成してますよという情報を入れます。
JISの場合はこんな感じです

GmailでもAmazonでもこのようになっていますがなぜ文字化けしないのでしょう?
ずばり、ヘッダでJISと指定しているが、内容は別な文字コードで送っているからです。
別とは言ってもUTF8など全くな別ものではなく、JISを拡張した文字コードを使用します。
ISO-2022-JP-MSという文字コードがあり、半角カナやJISにはない記号を扱うことができます。

PHPだと

PHPで日本語メールを送る簡単な方法といえばmb_send_mail()ですね。
この関数は言語に適切な文字コードにエンコードしてくれて
ヘッダに文字コードの指定なども自動でセットしてくれる便利なやつです。

ソースはこんな感じ

当たり前ですが、こんなことをしようものなら

この通り、化けてしまいます。

ではどうすればいいかというと mail() を使い、ヘッダの指定やエンコードは
自分で処理します。
ソースはこんな感じになります。

これならこの通り、文字化けせず!

ただ、ISO-2022-JP-MSという文字コードがPHPでサポートされるように
なったのは5.2.1からでそれ以前のバージョンでは使えませんのでご注意ください。
http://php.net/manual/ja/mbstring.supported-encodings.php

以上になりますが、来たる2/27にアライドアーキテクツのエンジニア・クリエイター勉強会を
開催いたします。
参加無料なのでぜひぜひご参加ください!
http://connpass.com/event/1812/