質問: PEARのQuickFormに関する質問です。 $form->addRuleでmaxlengthを50とした場合、全角文字では単純に÷2の25文字ではないのですか? 全角で16文字を超えるとエラーとなります。 100を指定すると33文字を超えると同じくエラーとなります。 また、minlengthでも同様の文字数で弾かれます。 アルファベットや数字の半角では、当然でしょうが50文字では通過し51文字では通過しなくなり正常に動作します。 全角では特殊な計算法があるのでしょうか? よろしくお願いします。 $form->addRule('form_value01', '文章が長すぎます', 'maxlength', 50, 'server');
回答: 使える文字数の少なかった古いJISコードでは全角2バイトだったわけですが、 JIS2004などの新しい規格や、UTFなどの国際規格では、 文字によって3バイトや4バイトになります。 QuickFormのmaxlengthはマルチバイトには非対応なので、 半角英数50文字(50Byte)だと全角16文字(3x16=48Byte)までしか入らないことになります。 案1)QuickFormを改造 strlenの部分をマルチバイト対応のmb_strlenに書き換えることで対応可能ですが、 PEARのアップデートで動かなくなるので推奨はしません。 案2)データベースの構造に合わせる 格納するカラムが100Byteだったらmaxlengthも100にするという単純な思考 案3)クライアントサイドスクリプトに頼る JQueryなどのライブラリに頼るのが最近のパターン おおよそ案2で問題になることはないと思いますが、 対外的に厳格な対応をしたいならば、案3でクライアント側でのチェックを行い、さらに値を受け取るphp側でもチェックするというような二重の対策が必要になってくるでしょう。