PHP5.3.0にmbstring.http_output_conv_mimetypesが来てた
via. [PHP-dev 1398] mb_output_handlerによる文字エンコーディング変換について
PHP-dev(ja)で出ていた件ですが、しっかりとPHP5.3.0α1から入ってました。id:moriyoshi++!id:masugata++!
一番ありがちなのは、docomo向けコンテンツをXHTMLで作成する場合、MIMETypeは
application/xhtml+xml
とする必要があります*1が、mb_output_handlerを使った出力エンコーディング変換をするにはMIMETypeが「text/」で始まる必要がある*2ので、「エンコーディングが変換されねー!」とかいうことになります。
で、エンコーディング変換するMIMETypeを正規表現で指定できるのが、mbstring.http_output_conv_mimetypesディレクティブです。たとえば、こんな感じ。
<?php mb_internal_encoding('utf-8'); mb_http_output("sjis-win"); ini_set('mbstring.http_output_conv_mimetypes', 'html'); header('Content-type: application/xhtml+xml; charset=Shift_JIS'); ob_start('mb_output_handler'); echo '<html><body>日本語です</body></html>'; ob_end_flush();
ただし、「正規表現で指定する」ことに注意。つまり、
<?php ini_set('mbstring.http_output_conv_mimetypes', 'application/xhtml+xml');
とやっちゃうとはまる。正しくは
<?php ini_set('mbstring.http_output_conv_mimetypes', 'application/xhtml\+xml');
な感じ。
php.iniに書いてもOK。
output_handler = mb_output_handler [mbstring] mbstring.language = Japanese mbstring.internal_encoding = utf-8 mbstring.http_input = sjis-win mbstring.http_output = sjis-win mbstring.encoding_translation = on mbstring.detect_order = sjis-win mbstring.substitute_character = none mbstring.func_overload = 0 mbstring.strict_encoding = Off mbstring.http_output_conv_mimetypes = html