layooo 2012-12-05 11:32:58 6072次浏览 0条回复 0 0 0

我把Yii应用程序加入到A站(因为A站是用RMB购买的,加密- -,无法扩展功能)。由于A站使用的是GBK编码,为了让Yii与之相处融洽,我就决定让Yii跟A站一个姓(GBK)。以下是我的处理过程: 1.复制一份儿框架中的中文语言包出来改为gbk编码,放在protected/messages,然后配置文件的components段中加入

// gbk编码的语言包
'coreMessages'=>array(
    //'basePath'=>null,
    'basePath'=>  dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'messages',
),

2.复制一份儿框架中的i18n中关于中文的文件改为gbk编码,放在protected/i18n/data下 然后config/main.php中加入 'localeDataPath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'../i18n/data', 3.复制一份儿框架中的views/exception.php到protected/views/system,改一下里面的编码为gbk,默认是utf8,否则调试页面就乱码了。

4.修改CHtml类:

CHtml类使用了htmlspecialchars来格式化输出,但htmlspecialchars不支持gbk编码。 当然,你可以把htmlspecialchars的编码去掉,但php5.4这样做时,就会没有输出。 一共改两个方法,一个是encode,还有一个encodearray

如果你使用了apc的话,请修改框架目录中yiilite.php中对应的两个方法。

如果你不使用apc的话,并且像我一样不愿意修改框架本身,可以把Chtml复制一份出来然后使用Yii的classmap来自定义这个类的路径。然后在入口文件处来定义,例如我的:

require_once ($yii);
//重写yii class map,使用自定义的CHtml。 yiilite中的代码要手动修改不能使用此方法覆盖
Yii::$classMap=array('CHtml'=>dirname(__FILE__).'/protected/extensions/helpers/CHtml.php');

下面是要修改的CHtml类中的两个方法

public static function encode($text)
{
    if(PHP_VERSION < '5.4.0') {
        return htmlspecialchars($text,ENT_QUOTES);
    }
    else
    {
        if(strtolower(Yii::app()->charset) == 'utf-8') {
            $charset = 'UTF-8';
        } else {
            $charset = 'ISO-8859-1';
        }
        return htmlspecialchars($text,ENT_QUOTES,$charset);
    }
 
    return htmlspecialchars($text,ENT_QUOTES,Yii::app()->charset);
}
public static function encodeArray($data)
{
    $d=array();
    foreach($data as $key=>$value)
    {
        if(is_string($key))
            $key=self::encode($key);
        if(is_string($value))
            $value=self::encode($value);
        else if(is_array($value))
            $value=self::encodeArray($value);
        $d[$key]=$value;
    }
    return $d;
}

(以上是按照 https://www.akii.org/yii-for-charset-gbk-and-chtml-enable-and-php5-4.html 方法修改的,担心可能网站不能显示,就自己先帖出来了- -)

5.config/main.php中加入

'charset' => 'gbk',
    'language'=>'zh_cn',  // 用户语言(for Locale)  
    // 信息和视图的语言  
    'sourceLanguage'=>'zh_cn',  
    'timeZone'=>'Asia/Shanghai',

数据库连接方式改为: 'charset' => 'gbk', 6./protected/views/layouts/main.php 的编码改为GBK <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> 应该没啥遗漏的了,当我完成这些工作以后,在本地测试完全没问题,心中窃喜。于是兴高采烈的FTP上传到了服务器。麻烦来了。在服务器中一般不和数据库打交道的页面是正常的,但是一打开需要连接数据库的页面,就报下面的错误:

CDbException

Warning: htmlspecialchars() [function.htmlspecialchars]: charset `gbk' not supported, assuming iso-8859-1 in /www/web/meidulm_com/www/yii/protected/views/system/exception.php on line 164
CDbConnection failed to open the DB connection: could not find driver

我的本地PHP版本是: 5.3.1,服务器上的版本是:5.2.17p1 数据库编码全是GBK的。应该不是数据库编码的问题吧~ 好了。问题就是这个,我不知道该肿么办了。总不能再把编码改回UTF-8吧- -,大伙看看能不能有办法解决呢?

问题终于解决了。

为WDCP PHP增加模块pdo_mysql

wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
/www/wdlinux/php/bin/phpize
./configure --with-php-config=/www/wdlinux/php/bin/php-config --with-pdo-mysql=/www/wdlinux/mysql<br />
make
make install

增加到配置文件里 # vi /www/wdlinux/etc/php.ini 在最后加入 extension=pdo_mysql.so

然后重起web服务,如

service httpd restart
service nginxd restart
    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册