Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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