文字化けする場合の対応例 -EC-CUBE-

"EC-CUBE"に限らずだがデータベースを用いるシステムで高い確率で出る問題が文字化けの対応で、ホスティングサーバを利用している場合はデータベースの設定を調節するのが難しいのでプログラム側で対応せざるを得ない。

今回私が出くわした文字化けは、データベース自体のデフォルトの文字コードが"EUC(ujis)"になっており、UTF8で動作する"EC-CUBE"では文字化けを起こすようだ。

"EC-CUBE"内で文字コードの設定があるのでその値を変更してみたり、phpMyAdminでテーブルやフィールドの文字コードを変更してみても文字化けは改善されない。

やはりインストール時に設定された文字コードが優先されているようだ。

 phpMyAdmin


"ラピッドサイト"のように仮想とはいえroot権限が与えられるホスティングはデータベースの設定ファイルだけでなく、インストール時から手を入れることができるのでプログラムで回避する以外にも手段がある。

しかし"CPI"など低コストだがroot権限が無いサーバの場合は対応に頭を悩ますことが多い。

"CPI"は文字化けは無かったのですっかり安心しきっていたが、今回は違うホスティングサーバだったので対応を余儀なくされた状態だ。


対応策を簡単に言うとデータベースとのやり取りを行う部分に文字化けしないタイプにエンコード処理を入れればいいのだが、数が多いと処理動作を入れるのが大変だし、何より検証が大変だ。


しかし、調べてみると"EC-CUBE"には2行入れただけで文字化け対策できる方法があるとのこと。

ちなみに今回利用する"EC-CUBE"のバージョンは「2.4.0」だ。
その前に文字化け対策でテーブルやフィールドの文字コードがUTF8になっているので再インストールでujisに戻しておく。

修正するファイルは「/data/class/SC_DbConn.php」。

まずは35行目ほどにある下記のDBコネクション部分を探す。


if(!isset($objDbConn->connection) || $new) {
 if($dsn != "") {
  $objDbConn = DB::connect($dsn, $options);
  $this->dsn = $dsn;
 } else {
  if(defined('DEFAULT_DSN')) {
   $objDbConn = DB::connect(DEFAULT_DSN, $options);
   $this->dsn = DEFAULT_DSN;
 } else {
  return;
 }
}



次に2行の文を下記のように追記する。


if(!isset($objDbConn->connection) || $new) {
 if($dsn != "") {
  $objDbConn = DB::connect($dsn, $options);
  $this->dsn = $dsn;
  // 以下を追記
  $buf = $objDbConn->prepare('SET NAMES utf8');
  $objDbConn->execute($buf);
 } else {
  if(defined('DEFAULT_DSN')) {
   $objDbConn = DB::connect(DEFAULT_DSN, $options);
   $this->dsn = DEFAULT_DSN;
 } else {
  return;
 }
}



処理の内容としては「SET NAMES utf8」でクライアントからのデータはUTF8で行うと宣言することになる。

この記載をしたファイルをサーバに上書き保存し、ブラウザで動作確認すると文字化けが発生せずに正常表示されるようになった。


今回はコネクションの部分の処理だったが、"EC-CUBE"はクラス化されているので文字エンコードしている部分を把握すればそこで対応しても手間は少ないかもしれない。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック