PEAR::Mailを使ったメールクラスを作っていて、日本語対応している途中でハマった。
$subject = mb_encode_mimeheader($subject, "ISO-2022-JP"); // 後に$subjectを件名にセットしたメールを送ると文字化けしてた
その後、以下のように修正してみた。
$subject = mb_encode_mimeheader(mb_convert_encoding($subject, "ISO-2022-JP". "auto"), "ISO-2022-JP"); // これでうまくいった!・・・かに見えたがダメだった
上記のように修正したところ、日本語は出るようになったが、Thunderbirdでメールを受信すると件名が途中から文字化けしていた。ちなみにGmailでは文字化けしていなかった。mb_encode_mimeheaderが悪いのか?と思い調査開始した。
検索してたら、mb_encode_mimeheaderのバグ?みたいに書いてある記述が多かったが、どうもそうではないという情報を得た。
mb_encode_mimeheaderは内部エンコードを元に、$subjectをISO-2022-JPに変換した上でmimeheader用にエンコードしてくれてるらしい。mb_encode_mimeheaderは無罪だと。つーかmb_encode_mimeheaderするならmb_convert_encodingしたらダメ!だって。そうなのか…。じゃあ上でやったのは、ダメなことじゃないか。しかし、開発サーバの内部エンコードはUTF-8じゃないのかな〜と思って、再度調査。その前にphpinfo()でmbstring.internal_encodingの値を見たら、no valueだった。
echo mb_internal_encoding(); // EUC-JPだと〜!!
そんな…。no valueだとEUC-JPになるのか?UTF-8じゃないのか?そう嘆いてもこれが現実。
// mb_encode_mimeheaderを使う前に… $default_internal_encode = mb_internal_encoding(); if($default_internal_encode != 'UTF-8'){ mb_internal_encoding('UTF-8'); } // mb_encode_mimeheaderを使った処理をする // $subjectの文字列の文字コードはUTF-8 $subject = mb_encode_mimeheader($subject, 'ISO-2022-JP'); // メール送信とかしちゃう // その後、元のinternal_encodeに戻す mb_internal_encoding($default_internal_encode);
これでOKでした。今までmb_encode_mimeheaderを疑っててごめんなさい。
一応、.htaccess側で、ローカルのmbstring.internal_encodingを設定しといた。
php_value mbstring.internal_encoding UTF-8
なるほど。
大変助かりました。