如果你的Yii框架不得已要使用gbk编码,你要做的有四件事:
1.复制一份儿框架中的中文语言包出来改为gbk编码,放在protected/messages,然后配置文件的components段中加入
1
2
3
4
5
|
//
gbk编码的语言包 'coreMessages' => array ( //'basePath'=>null, 'basePath' =>
dirname( __FILE__ ).DIRECTORY_SEPARATOR. '..' .DIRECTORY_SEPARATOR. 'messages' , ), |
2.复制一份儿框架中的i18n中关于中文的文件改为gbk编码,放在protected/i18n/data下
然后config/main.php中加入
1
|
'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来自定义这个类的路径。然后在入口文件处来定义,例如我的:
1
2
3
|
require_once
( $yii ); //
重写yii class map,使用自定义的CHtml。 yiilite中的代码要手动修改不能使用此方法覆盖 Yii:: $classMap = array ( 'CHtml' =>__DIR__. '/../protected/extensions/helpers/CHtml.php' ); |
下面是要修改的CHtml类中的两个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 ; } |