标签归档:zend framework

解决Zend_Filter_Input中文乱码问题

Zend_Filter_Input默认会给所有通过的数据添加一个HtmlEntities的过滤器。不幸的是,这个HtmlEntities使用的是ISO-8859-1编码,如果你使用的是GB2312或者UTF-8一类的编码,那中文字符就惨了,乱码无疑。

想要避开这个问题,就不能再用$input->field的方式访问数据了,要用$input->getUnescaped(‘field’)的方式,这样会忽略掉默认的HtmlEntities过滤器。如果你仍然喜欢用$input->field的方式,往下看:

一个简单的解决方法是直接去改Zend/Filter/HtmlEntities.php文件,把构造函数(public function __construct($quoteStyle = ENT_COMPAT, $charSet = ‘ISO-8859-1’))里第二个参数的默认值改成你的网站使用的编码。

这个方法还有一个额外的好处,以后当你使用HtmlEntities时也无需再指定编码了。虽然通常不鼓励直接修改Zend Framework的源文件,但是这一点小小的改动不会有什么英系那个。唯一的弊端就是每次升级Zend Framework时必须再改一次。

另一个方法是用别的过滤器替换掉默认的HtmlEntities过滤器。你可以使用其他的标准过滤器,比如StringTrim;也可以模仿HtmlEntities写个你自己的html转移过滤器,用上你自己的网站编码;还可以创建一个空过滤器,不进行任何过滤。然后在实例化Zend_Filter_Input时这样写:

 $myFilter);
$input = new Zend_Filter_Input($filters, $validators, $data, $options);
?>

或者:

setDefaultEscapeFilter($myFilter);
?>

大功告成!