PEARのQuickFormに関する質問です。

$form->addRuleでmaxlengthを50とした場合、全角文字では単純に÷2の25文字ではないのですか?
全角で16文字を超えるとエラーとなります。
100を指定すると33文字を超えると同じくエラーとなります。
また、minlengthでも同様の文字数で弾かれます。

アルファベットや数字の半角では、当然でしょうが50文字では通過し51文字では通過しなくなり正常に動作します。
全角では特殊な計算法があるのでしょうか?
よろしくお願いします。

$form->addRule('form_value01', '文章が長すぎます', 'maxlength', 50, 'server');

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/09/07 21:32:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

使える文字数の少なかった古い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側でもチェックするというような二重の対策が必要になってくるでしょう。

id:appfb

引き続き、ご回答ありがとうございます。

> JIS2004などの新しい規格や、UTFなどの国際規格では、文字によって3バイトや4バイトになります。
全く知りませんでしたorz
正常に機能していただけなのですね。

早速、いただきました(案3)を調べたいと思います。
ありがとうございました。

2013/09/06 15:32:13

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません