如果你的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
;
}
|