mb_encode_mimeheader()の使い方

mb_encode_mimeheader()は、mbstring.internal_encoding*1から第二引数の文字コード、またはmbstring.languageで指定した言語に合った文字コード(JapaneseならISO-2022-JP)に変換した上でbase64エンコードエンコード情報を付加します。
よって、レンタルサーバphp.iniの設定が不十分な場合、個別に設定したい場合は、関数をコールする前にmb_language()、mb_internal_encoding()で値を設定する必要があります。


よく見かけますが、第一引数に渡す文字列をISO-2022-JPへ変換する必要はありません。
正しくは必要がないのではなく、やってはいけません。

<?php
mb_language('ja');
mb_internal_encoding('UTF-8');

$subject = '十分に長いsubjectでのテストを行います、まる';

echo mb_encode_mimeheader($subject) . "\n";
echo mb_encode_mimeheader(mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8')) . "\n";
?>

結果。

=?ISO-2022-JP?B?GyRCPT1KLCRLRDkkJBsoQnN1YmplY3QbJEIkRyROJUYlOSVIJHIbKEI=?=
 =?ISO-2022-JP?B?GyRCOVQkJCReJDkhIiReJGsbKEI=?=
=?ISO-2022-JP?B?GyRCPT1KLCRLRDkkJBsoQnN1YmplY3QbJEIkRyROJUYlOSVIJHI5VCQk?=
 =?ISO-2022-JP?B?JF4kOSEiJF4kaxsoQg==?=

なんか後半が違います。


mb_decode_mimeheader()は大方の予想通りmb_encode_mimeheader()と逆の動作をしそうです。

<?php
mb_language('ja');
mb_internal_encoding('UTF-8');

$subject = '十分に長いsubjectでのテストを行います、まる';

$utf = mb_encode_mimeheader($subject);
$iso = mb_encode_mimeheader(mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8'));

echo mb_decode_mimeheader($utf) . "\n";
echo mb_decode_mimeheader($iso) . "\n";
?>

結果。

十分に長いsubjectでのテストを行います、まる
十分に長いsubjectでのテストを行い$^$9!"$^$k


そもそも、mb_encode_mimeheader()を通した段階で結果が違うのがおかしいですね。

<?php
mb_language('ja');
mb_internal_encoding('UTF-8');

$subject = '十分に長いsubjectでのテストを行います、まる';

mb_internal_encoding('ISO-2022-JP');
$iso = mb_encode_mimeheader(mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8'));
echo $iso . "\n";
mb_internal_encoding('UTF-8');
echo mb_decode_mimeheader($iso) . "\n";
?>

結果。

=?ISO-2022-JP?B?GyRCPT1KLCRLRDkkJBsoQnN1YmplY3QbJEIkRyROJUYlOSVIJHIbKEI=?=
 =?ISO-2022-JP?B?GyRCOVQkJCReJDkhIiReJGsbKEI=?=
十分に長いsubjectでのテストを行います、まる

mb_encode_mimeheader()に渡す文字列はISO-2022-JPに変換するな。


自分のとこのblogだと周知されなそうなのではてダにも。
はてな市民権が欲しいんです?

*1:ISO-2022-JPエンコードしたもの投げたときの動作みるとdetect_ order?