Wadslog

[Zend Framework] Zend_Validate_StringLengthの処理

Mar 5, 2008

文字数が指定範囲内にあるかどうかをチェックするZend_Validate_StringLengthのバリデート処理は以下のようになっています。public function isValid($value) { $valueString = (string) $value; $this->\_setValue($valueString); $length = iconv\_strlen($valueString); if ($length < $this->\_min) { $this->\_error(self::TOO\_SHORT); } if (null !== $this->\_max && $this->\_max < $length) { $this->\_error(self::TOO\_LONG); } if (count($this->\_messages)) { return false; } else { return true; } }文字列の長さをiconv_strlen()という関数で出しています。 この関数は、第二引数が指定されていない場合エンコードはiconv.internal_encodingであると判断されます(Zend_Validate_StringLengthでは省略されています)。 iconv関連の設定はphp.iniではデフォルトでコメントアウトされていて、iconv.internal_encodingはデフォルト値のISO-8859-1(Latin1)となります。 このままでは、日本語でのバリデート処理がうまくいきません。 対策として、 1. php.iniの iconv.internal_encodingを使用している文字セットに変更する。 2. Zend_Validate_StringLengthのisValid()を呼び出す前に、iconv_set_encoding()でiconv.internal_encodの値を変更するutf-8の場合 ingiconv\_set\_encoding('internal\_encoding', 'utf-8');3. mbstringが有効になっているならば、Zend_Validate_StringLengthのisValidの部分を拡張して新しいクラスを作る。``` require_once ‘Zend/Validate/StringLength.php’;

class Zend_Validate_MbstringLength extends Zend_Validate_StringLength { public function isValid($value) { $valueString = (string) $value; $this->_setValue($valueString); $length = mb_strlen($valueString); // ←ここを変更 if ($length < $this->_min) { $this->_error(self::TOO_SHORT); } if (null !== $this->_max && $this->_max < $length) { $this->_error(self::TOO_LONG); } if (count($this->_messages)) { return false; } else { return true; } }

}

comments powered by Disqus