Ethna 携帯サイト用 validate

Ethna で携帯サイトを開発していて、キャリアによってフォームから

入力される文字列の文字コードが SJIS の場合と UTF-8 の場合があり、

max(文字列の長さ) の validate で、それぞれの文字コードの strlen()

の結果が違うのでうまくいきませんでした。

文字コードを統一してから validate すれば良いのですが、

そうもできない事情があり、validate plugin を作成してみました。

SJIS か UTF-8 が入力される $nickname の validate の場合に

ActionForm で以下のように定義します。

validate の条件は半角で8文字、全角で4文字以下の場合。

 
var $form = array(
 
'nickname' => array(
 
'type' => VAR_TYPE_STRING,
 
'form_type' => FORM_TYPE_TEXT,
 
'name' => 'ニックネーム',
 
'required' => true,
 
'utf8max' => array(
 
'utf8max' => true,
 
'max' => 8),
 
),
 
);

そして、以下のような Validate Plugin を作成しました。

example/app/plugin/Validate/Example_Plugin_Validator_Utf8max.php

 
<?php
 
class Example_Plugin_Validator_Utf8max extends Ethna_Plugin_Validator
{
function &validate($name, $var, $params)
{
$true = true;
$type = $this->getFormType($name);
if (isset($params['utf8max']) == false || $this->isEmpty($var, $type)) 
{
return $true;
}
$encode に文字列の文字コードが入っている
if ($encode == 'UTF-8') {
if (mb_strwidth($var, 'UTF-8') > $params['max']) {
$msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい";
return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
array(intval($params['max']/2), $params['max']));
}
} else {
if (strlen($var) > $params['max']) {
$msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい";
return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
array(intval($params['max']/2), $params['max']));
}
}
}
}
?>

意図する validate ができましたが、もっともっと良い方法があると思います。
皆さんはどうやっているのでしょうか…?