Contents
- UNIX
- Windows
- サーバ
- プログラミング言語
- データベース
- プロトコル
- サービス
- オープンソース
- 規格・技術
- アプリケーション
- PC
- DEVICE
- その他(未分類)
お問合せ: メールフォーム
携帯に対応するため、
内部エンコーディング(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_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
PHPスクリプト内
ini_set('mbstring.http_output', 'SJIS-win'); ini_set('mbstring.detect_order', 'auto');
ハマってしまった最大の原因は、mbstring.internal_encoding と mbstring.http_input は PHP_INI_ALL なので、PHPスクリプト内で設定していたことです。
これらは、 PHP_INI_PERDIR と解釈した方が無難です。
または細かいことは考えず、mbstring系 の設定はすべて php.ini や .htaccess で行うと良いかもしれません。
ちなみにですがマニュアルでは、
名前 | デフォルト | 変更の可否 | 変更履歴 |
---|---|---|---|
mbstring.internal_encoding | NULL | PHP_INI_ALL | PHP 4.0.6 以降で利用可能。 |
mbstring.http_input | “pass” | PHP_INI_ALL | PHP 4.0.6 以降で利用可能。 |
となっています。
http://www.php.net/manual/ja/ini.list.php
mbstring.encoding_translation に関わる場合は、PHP_INI_PERDIR となる例外でもあるのでしょうか。
コメント (ご自由にお書きください)