PHPのmb_encode_mimeheaderは事前にmb_internal_encodingが必要

PHPのmb_encode_mimeheader関数で文字列をエンコードするときは、直前にmb_internal_encoding関数で変換したい文字列のエンコーディングをセットしてから呼ばないとうまく動作しないもよう。エンコードした文字列の後ろのほうが化け化けになってしまう。例えば「ご登録いただきありがとうございます」が「ご登録いただきありがH$&$4$6$$$^$9」というふうに。

回避例として、以下のように書く。

// 元のエンコーディングを保存
$orgEncoding = mb_internal_encoding();
// 変換したい文字列のエンコーディングをセット
mb_internal_encoding($targetEncoding);
// エンコーディング実行
$encodedString  = mb_encode_mimeheader($targetString, $targetEncoding, 'B', "\n");
// 保存しておいたエンコーディングに戻す
mb_internal_encoding($orgEncoding);

PHPのバージョンは5.1.2。

コメント / トラックバック

コメント / トラックバック 7 件

  1. mb_internal_encoding()は必須か? - よくきたblog

    はてなダイアリーのよくきたはてなから移動.mbstringで日本語を扱う上では「必須」になります. 理由はデフォルトは「ISO-8859-1」なので. し...

  2. :備忘録

    :備忘録 気になる書籍 † 管理職要覧〔改訂版〕―日本的MTP システム分析・改善...

  3. LEGGODT.COM より:

    PHPで日本語を使うのだ

    新しいサーバーをいじるときに必ずやらなければ行けないこと。 それは日本語、マル...

  4. mb_encode_mimeheaderの都市伝説を検証する

    ■mb_encode_mimeheader都市伝説mb_encode_mimeheaderは、なんか使いにくい。文字化けする。とあまり良い評判を聞きません...

  5. [...] もう少しだけ調べてみると、内部文字コードを一時的に変換対象文字列の文字コードにあわせるという方法でも回避可能らしい。 [...]

  6. [...] PHPのmb_encode_mimeheaderは事前にmb_internal_encodingが必要 [...]

  7. […] PHPのmb_encode_mimeheaderは事前にmb_internal_encodingが必要 これだからPHPはめんどくさいんだよ。。。 […]