PHP:mb_encode_mimeheaderでハマる

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()の使い方

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

タグ PHP | パーマリンク.

コメント・トラックバック一覧

  1. Edmund Edgar says:

    なるほど。

    大変助かりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です