2008-05-10 [長年日記]
_ PHP の mbstring.language と internal_encoding でビックリした件
いやー久しぶりにビックリしたわ。さすが PHP.
mbstring について何の設定もしていない状態で有効にしてある PHP を用意して以下のコードを動かしてみてください。
.htaccess
AddType application/x-httpd-php .php php_value mbstring.language Japanese
mbstring.language.php
<?php print "<pre>"; echo PHP_VERSION."\n"; print_r( mb_get_info() ); mb_internal_encoding( 'euc-jp' ); print_r( mb_get_info() ); print "</pre>";
マニュアル
によると
- mbstring.language は mbstring.internal_encoding を設定するので mbstring.internal_encoding は mbstring.language のあとで設定しろ
- language が Japanese の場合は internal_encoding は EUC-JP が自動でセットされる*1
と書かれています。
ということは 1回目の mb_get_info() も 2回目も
[internal_encoding] => EUC-JP
になるはずなんだけど、これ
EUC-JP になったりならなかったりする
というステキな動作をします。え? なんで? まったく分からない。何の変更も加えていないこのスクリプトを何度も実行していると、1回目の mb_get_info() の出力が変化します*2。
どういうことやねん
というか、
こんな中途半端な機能ない方がマシです。おっかなくて使えたもんじゃない。
「internal_encoding とか mail_charset とか必要な設定を各自が確実に行いなさい」と言うだけでよくね? language を設定する意味ってなんなの?
ちなみに確認は
- PHP 5.1.6@CentOS 5.1
- PHP 4.4.8@FreeBSD 6.3
で行いました。
さらにちなみに、Twitter でブータレてたら同じ経験をしている人がやはりいました。
Twitter / ryota ichie: @wtnabe 自分もphq4で経験あります!結局原因...
結構昔からずっとこの動作なんでしょうねぇ*3。すっげー気持ち悪い。まぁ、
internal_encoding をはじめ、必要な項目には確実に明示的に値をセットしてから使いましょう
ってことですな。