iconv() が使えない環境で codeigniter 2.0.3 に発生する問題と回避方法
更新日:2019年7月31日
公開日:2012年12月10日
公開日:2012年12月10日
codeigniter で開発した多言語対応のWEBアプリケーションをお客様のテスト環境で動かした際に、開発環境では発生しないトラブルに悩まされました。UTF-8の文字列をハンドリングする部分が原因だったのですが、codeigniter の core を置き換える方法で解決することができました。
【現象】
お客様のサーバで動作させた場合にだけ、フォームへの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チーム:堤