内部エンコーディングと出力エンコーディングが異なる場合は、php.iniでは入力エンコーディング変換をせず、mb_convert_variablesなどで、自力で変換する。※
※mb_convert_variablesでは、だめな場合がある。
これは、
mb_convert_variables() は、エンコーディング検出の ためにArrayまたはObjectの文字列を結合します。これは、 エンコーディング検出は短い文字列では失敗する傾向があるためです。このため、 1 つの配列またはオブジェクトにエンコーディングを混ぜることはできません。
だからだろうか?
なので、
array_walkとmb_convert_encodingで再帰処理する。
また、
変換するのは$_POSTのみにする。$_GET、$_COOKIE、$_REQUESTは変換しない。
例:
function convert_encoding(&$item, $key, $encoding){
if (is_array($item)){
array_walk($item, 'convert_encoding', $encoding['to'], $encoding['from']);
} else {
$item = mb_convert_encoding($item, $encoding['to'], $encoding['from']);
}
}
//array_walk($_GET, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
array_walk($_POST, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
//array_walk($_COOKIE, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
//array_walk($_REQUEST, 'convert_encoding', array('to' => $internal_encoding, 'from' => $http_output));
mb_convert_variables
PHP/tips/日本語環境php.ini設定 - PukiWiki