Codeigniterで文字コード「Shift-JIS」のお問い合わせフォームを作成したら文字化けた・・・。

具体的な現象として、Codeigniterの関数でPOSTすると値が空になってしまう。

$this->input->post();
set_value();

原因としては、PHPのバージョンが原因でした。
以下、原因の箇所

$str = htmlspecialchars($str);

htmlspecialchars()関数は、変換に使用されるエンコーディングを省略した場合にデフォルト値を、PHP 5.4.0 より前のバージョンでは ISO-8859-1、そして PHP 5.4.0 以降では UTF-8 とする。

参考
http://www.php.net/manual/ja/function.htmlspecialchars.php

開発環境が、PHP5.4以上を使用していたため、
Codeigniter関数内では、htmlspecialchars()がデフォルト文字コードUTF-8 として
処理するため、POSTの値が消えてしまっていたみたいです。

解決策として、
application/helpers に以下MY_form_helper.phpとか名前を付けたファイルを配置して、
中に以下の記述を行う。

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('form_prep'))
{
function form_prep($str = '', $field_name = '')
{
static $prepped_fields = array();

// if the field name is an array we do this recursively
if (is_array($str))
{
foreach ($str as $key => $val)
{
$str[$key] = form_prep($val);
}

return $str;
}

if ($str === '')
{
return '';
}


if (isset($prepped_fields[$field_name]))
{
return $str;
}
// php5.4以降のhtmlspecialchars()のデフォルト文字コードの違い
// application/config/config.php の charset を出力
$CI = get_instance();
$config = $CI->config->config;

$str = htmlspecialchars($str, ENT_QUOTES, $config['charset']);

// In case htmlspecialchars misses these.
$str = str_replace(array("'", '"'), array("'", """), $str);

if ($field_name != '')
{
$prepped_fields[$field_name] = $field_name;
}

return $str;
}
}

これで解決するのではないのでしょうか?

ではまたノシ

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください