HTTP 入出力の文字エンコーディング変換はバイナリデータも変換して しまいます。HTTP 入出力にバイナリデータが使用される場合、ユーザは、 文字エンコーディング変換を制御する必要があります。
注意:
PHP 4.3.2 およびそれ以前のバージョンの場合、 HTML フォームのenctype が multipart/form-data に設定された場合、 mbstring は、POST データの文字エンコーディングを変換しません。 この場合、文字列を内部文字エンコーディングに変換してやる必要があります。
PHP 4.3.3 以降、HTML フォームの enctype が multipart/form-data に設定され、かつ、 php.ini において mbstring.encoding_translation に On が指定されている場合、 POST データの変数とアップロードされたファイルの名前の文字エンコーディングは、 内部文字エンコーディングに変換されます。 ただし、クエリキーに関しては、変換されません。
PHP スクリプトで HTTP 入力文字変換を制御する手段はありません。 HTTP 入力文字変換を無効にするには、php.ini で行う必要があります。
例1 php.ini で HTTP 入力変換を無効にする
;; HTTP 入力変換を無効にする mbstring.http_input = pass ;; HTTP 入力変換を無効にする (PHP 4.3.0 以降) mbstring.encoding_translation = Off
PHP を Apache モジュールで使用する場合、php.ini の設定を httpd.conf により仮想ホスト単位で、または .htaccess によりディレクトリ単位で上書きすることが可能です。 詳細は、設定の節および Apache マニュアルを参照ください。
出力の文字エンコーディング変換を有効にする方法は複数あります。 まず php.ini、もうひとつは ob_start() で ob_start のコールバック関数として mb_output_handler() を指定するものです。
例2 php.ini の設定例
;; 全ての PHP ページで出力の文字エンコーディング変換を有効にする ;; 出力バッファリングを有効にする output_buffering = On ;; mb_output_handler による出力変換を有効にする output_handler = mb_output_handler
例3 スクリプトの例
<?php
// このページでのみ出力の文字エンコーディング変換を有効にする
// HTTP 出力文字エンコーディングをSJISに設定する
mb_http_output('SJIS');
// 出力のバッファリングを開始し、コールバック関数として"mb_output_handler"
// を指定する
ob_start('mb_output_handler');
?>