2012年12月10日

codeigniter で開発した多言語対応のWEBアプリケーションをお客様のテスト環境で動かした際に、開発環境では発生しないトラブルに悩まされました。UTF-8の文字列をハンドリングする部分が原因だったのですが、codeigniter の core を置き換える方法で解決することができました。

iconv() が使えない環境で codeigniter 2.0.3 に発生する問題と回避方法

【現象】

お客様のサーバで動作させた場合にだけ、フォームへのPOST/GETした英数字以外のマルチバイト文字が消えてしまう。
マルチバイト文字だけ消えるというのが不思議で、英数字は問題なくPOST/GETできます。

【原因】

codeigniter の system 内で iconv() が使用されているが、

お客様のサーバ環境では iconv() が利用できない状態になっており、iconv() を通った文字列が全て消える状態だった。

【対処法】

system/core/Utf8.php 内で iconv() を使用している部分を置き換えた。

↓の部分。

  function clean_string($str)
  {
    if ($this->_is_ascii($str) === FALSE)
    {
      //$str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);
      global $CFG;
      $str = $this->convert_to_utf8($str, $CFG->item('charset'));
    }
 
    return $str;
  }

他にも convert_to_utf8() という関数でも iconv() を呼んでいる部分があり、あわせてmbstring を使うように修正しました。

事前にお客様のサーバの phpinfo() を確認して開発環境とあわせていたつもりでしたが、「iconv implementation」が「unknown」になっていることを見逃していました。UTF-8で codeigniter を使う場合は(ほとんどの場合がそうだと思いますが)、忘れずにチェックすることにします。

 

WEBチーム:堤