Zend_Filter_Input 的乱码问题

Mar 18th, 2009 | Filed under PHP

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')
);
?>

😀

Tags: , ,
Comments are closed.