Shift-JISでPOSTが文字化ける

2014年1月27日

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

 

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

ではまたノシ

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-CodeIgniter