|
发表于 2008-3-29 14:45:54
|
显示全部楼层
我遇到过类似的问题
application/config/database.php中这么设置
...
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
会使得从数据库中查出来的中文以utf8格式编码,如果HTML页面是gbk编码就会出现乱码
必须手工对每个字段进行转码,例如:
echo iconv('utf-8', 'gbk', $row->title);
当然这么干是很恐怖的事情,不仅硬编码字符串,而且工作量极大。
但是当我把application/config/database.php改为gbk时,
...
$db['default']['char_set'] = "gbk";
$db['default']['dbcollat'] = "gbk_general_ci";
页面会报告字符集不能设置为gbk,我没打算深入研究mysql的字符集,所以仅仅只是查了一下CI的源码,发现是
system/database/drivers/mysql/mysql_driver.php中的db_set_charset函数出了问题:
PHP复制代码
function db_set_charset ($charset, $collation)
{
return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
}
复制代码
进一步测试,发现
mysql执行查询SET NAMES 'gbk'没有问题,但是执行SET NAMES 'gbk' COLLATE 'something'就会报错,进而影响mysql的查询语言集设置
或许也和我安装mysql时的字符集设置有关,总之我不想纠缠,先解决问题为妙,方法如下:
PHP复制代码
function db_set_charset ($charset, $collation)
{
//解决设置gbk时报错的问题
return @mysql_query("SET NAMES '".$this->escape_str($charset)."'", $this->conn_id);
//return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
}
复制代码
在模板、页面和mysql中全部使用gbk编码 |
|