EUC-JPで書かれたPHPスクリプトを、Shift_JISとして出力する場合
以下のように .htaccess に書く。
<IfModule mod_php5.c>
# 内部コードは、スクリプトと同じにする。 php_value mbstring.internal_encoding EUC-JP
# 出力をバッファリング&変換する php_value output_handler mb_output_handler php_value mbstring.http_output SJIS
</IfModule>
EUC-JPのページからのPOSTを、Shift_JISのページ内で出力する場合
php_value mbstring.http_input auto php_value mbstring.encoding_translation On
ユーザからの入力を自動的にエンコーディング変換する場合
.htaccess を以下のように設定しておく。
<IfModule mod_php5.c> php_value mbstring.internal_encoding euc-jp php_value default_charset SJIS php_value output_handler mb_output_handler php_value mbstring.http_output SJIS php_value mbstring.http_input auto php_value mbstring.encoding_translation On </IfModule>
以下のような設定。
- 内部コード(&PHPのスクリプト)は、euc-jp
- Content-Type レスポンスヘッダに付く charset は、Shift_JIS
- PHPスクリプトからの標準出力は、Shift_JISに変換される
- スクリプトへの標準入力は、内部コード(euc-jp)に自動的に変換される
この設定であれば、PHPスクリプトをeuc-jpで書いておけば、ほぼ期待通り動くはず。
自動エンコーディング変換を行わない場合
入力がeuc-jp以外の場合も考えられるため、処理する前に明示的に文字コードの変換を行うほうがいいかもしれない。その場合は、自動的なエンコーディング変換を行わないように、php.iniを少し変える。
php_value mbstring.http_input pass php_value mbstring.encoding_translation Off
PHPスクリプト内では、mb_convert_encoding()で、明示的に変換する。
$str = $_POST['str']; mb_convert_encoding($str, "euc-jp", "auto");
別の文字エンコーディング変換ライブラリ
Jcode
正しく文字エンコーディング変換できない場合
- たとえば、EUC-JP の「連邦」は、変換できない
euc-jpのページからの入力を受ける場合。(内部エンコーディングもeuc-jp)
$str = $_GET['str']; mb_convert_encoding($str, "euc-jp", "auto"); // 失敗する
autoではなく、明示的に "euc-jp" としても失敗する。
$str = $_GET['str']; mb_convert_encoding($str, "euc-jp", "euc-jp"); // 明示的に指定しても失敗する
mb_detect_encoding()の結果を見ると、失敗していることがわかる。
$str = $_GET['str']; var_dump(mb_detect_encoding($str));