̃Gg[͂ĂȃubN}[Nɒlj

PHP :: mbstring.internal_encoding と mbstring.http_input は PHP_INI_PERDIR ?



携帯に対応するため、

内部エンコーディング(internal_encoding)UTF-8
出力(http_output)SJIS-win

とした時のお話。

フォームで渡される値($_POST や $_GET)の文字コードをスクリプト内でいちいち変換するのは手間なので、PHPに標準で用意されている mbstring.encoding_translation を利用するのが一般的だと思います。
これを利用すれば外部から渡された値を内部エンコーディングに透過的に変換してくれるので、作り手としては変換を意識する必要がなくなります。


設定としては、まず php.ini や .htaccess に以下のように記述します。

output_buffering = On
output_handler = mb_output_handler
mbstring.language = Japanese
mbstring.encoding_translation = On
  • これらは「変更の可否」が PHP_INI_PERDIR なので php.ini や .htaccess で設定する必要があります。(スクリプト内で設定できない)
  • .htaccess の場合は、行頭に php_value を付与し、= は不要です。


上記の設定だけではもちろん足りませんが、あとの設定は PHP_INI_ALL なのでスクリプト内で設定することにします。
今回フレームワークを利用したので、初期化メソッド内にて以下を一回だけ実行することにしました。

ini_set('mbstring.internal_encoding', 'UTF-8');
ini_set('mbstring.http_input', 'auto');
ini_set('mbstring.http_output', 'SJIS-win');
ini_set('mbstring.detect_order', 'auto');


しかし、上記設定ではフォームで渡される値が文字化けします。透過的に変換してくれません。
PHPのバージョンは 5.1.6 です。

はまりにハマったあげく、以下の設定で解決できました。


php.ini or .htaccess

output_buffering = On
output_handler = mb_output_handler
mbstring.language = Japanese
mbstring.encoding_translation = On
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
  • .htaccess の場合は、行頭に php_value を付与し、= は不要です。


PHPスクリプト内

ini_set('mbstring.http_output', 'SJIS-win');
ini_set('mbstring.detect_order', 'auto');


ハマってしまった最大の原因は、mbstring.internal_encodingmbstring.http_inputPHP_INI_ALL なので、PHPスクリプト内で設定していたことです。
これらは、 PHP_INI_PERDIR と解釈した方が無難です。
または細かいことは考えず、mbstring系 の設定はすべて php.ini や .htaccess で行うと良いかもしれません。


ちなみにですがマニュアルでは、

名前デフォルト変更の可否変更履歴
mbstring.internal_encodingNULLPHP_INI_ALLPHP 4.0.6 以降で利用可能。
mbstring.http_input“pass”PHP_INI_ALLPHP 4.0.6 以降で利用可能。

となっています。
http://www.php.net/manual/ja/ini.list.php


mbstring.encoding_translation に関わる場合は、PHP_INI_PERDIR となる例外でもあるのでしょうか。





コメント (ご自由にお書きください)

Enter your comment
 
programming/php/settings/mbstring_internal_encoding_http_input.txt