Zend_Filter_Input 的乱码问题
Zend_Filter_Input 可以用来获得安全可靠的用户数据,简单的来说这个类就像一个黑盒,原始数据输入后,经过过滤器过滤,然后再由校验器校验,若通过了原先设定的过滤及校验规则,则最后输出可用的数据,否则给出详细的错误报告。
为了数据安全,比如转义一些特定字符,默认情况下 Zend_Filter_Input 会使用 HtmlEntities Filter 过滤所有的数据,然而不幸的是,这个 HtmlEntities 使用默认编码 ISO-8859-1,如果是中文等多字节语种,那么最后数据就会出现乱码,面目全非。
最近我在自己的项目中就遇到这个问题,其实解决方法很多,多写几行代码而已,但是因为乱码的问题由来已久,而且造成乱码的原因也非常多,找不到问题所在,那就恼火的很了,这里简单总结了一下。
方法一:修改 Zend/Filter/HtmlEntities.php
找到构造函数 __construct($quoteStyle = ENT_COMPAT, $charSet = ‘ISO-8859-1′) 的第二个参数,修改成需要的编码格式,比如你的项目统一使用 UTF-8 编码,那么这里就可以改成 UTF-8。
hmm,但是并不推荐这么做,因为之后每次升级 ZF,都要修改一次,很容易遗忘。
方法二:使用其它的默认过滤器
比如使用 StringTrims 替代 HtmlEntities,这样其实是绕过了乱码问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $options = array('escapeFilter' => 'StringTrim'); $input = new Zend_Filter_Input($filters, $validators, $data, $options) // 或者使用你自己编写的过滤器 $myfilter = new MyFilter(); $options = array('escapeFilter' => $myfilter); $input = new Zend_Filter_Input($filters, $validators, $data, $options) // 同上,不过使用了 setDefaultEscapeFilter() 方法 $input = new Zend_Filter_Input($filters, $validators, $data); $input->setDefaultEscapeFilter($myFilter); ?> |
方法三:使用 HtmlEntities
这里仍然使用默认的 HtmlEntities,但是由我们自己初始化实例指定正确的编码参数。
当然有个问题就是,你可能需要在每个表单处理代码中都来手工指定 UTF-8 编码,如果不喜欢这种硬编码方式,则可以把参数放在配置文件中,有 Zend_Config 载入,这样的话以后如果需要切换编码,只要修改配置文件即可。
1 2 3 4 5 6 | <?php $input = new Zend_Filter_Input($filters, $validators, $data); $input->setDefaultEscapeFilter( new Zend_Filter_HtmlEntities(ENT_COMPAT, 'UTF-8') ); ?> |