PEAR::Mailを使ったメールクラスを作っていて、日本語対応している途中でハマった。
1 2 | $subject = mb_encode_mimeheader( $subject , "ISO-2022-JP" ); // 後に$subjectを件名にセットしたメールを送ると文字化けしてた |
その後、以下のように修正してみた。
1 2 | $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だった。
1 | echo mb_internal_encoding(); // EUC-JPだと〜!! |
そんな…。no valueだとEUC-JPになるのか?UTF-8じゃないのか?そう嘆いてもこれが現実。
01 02 03 04 05 06 07 08 09 10 11 12 13 | // 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
なるほど。
大変助かりました。