Webプログラミング
2011年09月22日
PHPでのMIMEエンコード、デコードで文字化け
phpからメールを送る際に、ちょっとはまったので覚え書きを。
元々の思い込みとしては、
- メールヘッダの文字コードはJIS(ISO-2022-JP)に変換
Subject以外のヘッダの日本語部分は全てMIMEエンコードする
をきちんとやれば文字化けはしないはず、ということ。
…のつもりが何故か文字化けします。
構文は、例えば
$headers = "From: ".mb_encode_mimeheader(mb_convert_encoding("氏名", 'ISO-2022-JP', 'EUC-JP'))." <メールアドレス>\n";
な感じ。
(ちなみに訳あってコードはEUC-JPで書いてます)
ところがこれで化けます。
結論としては、
mb_language('japanease');
mb_internal_encoding('EUC-JP');
$headers = "From: ".mb_encode_mimeheader("氏名")." <メールアドレス>\n";
でいい様です。
mb_encode_mimeheader()、mb_decode_mimeheader()共に受け渡しの文字コードは指定できないわけですが、これがいわゆる「内部エンコーディング指定」で行なわれている様なんです。
つまり、内部エンコーディングに指定した文字コードで受け渡しをすれば適切に処理してくれる、ということ。
こういうブラックボックスな仕様はやめてほしいものです。
文字化けに関する基本的な考え方としては以下がとても参考になります。
PHPの文字化けを本気で解決するhttp://hain.jp/index.php/tech-j/2007/02/13/p125
何よりも問題の本質は、日本語文字コードが乱立していることなんでしょうけどね…。
なににせよ、日本語処理には悩まされることが多いですね。
--
これがないと始まりません。
かなり痛んできたので、そろそろ買い直そうかと。