PHP 文字エンコーディング

Last-modified: 2007-08-14 (火) 23:08:30

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));