• ベストアンサー

全角、半角文字の判別について

フォームのテキストで全角なら10文字まで、半角なら20文字まで入力できるようにしたいのですが、EUCの場合、半角カナは2バイトになるため、バイト数で制限をかけるとうまくいきません。かといって文字数で制限をかけてもうまくいきません。 何かいい方法はあるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#24096
noname#24096
回答No.2

即興で書いたのでチェックはいい加減ですがこんな感じでいかがでしょう。 <?php function chkhankana($chr){ if(isset($chr)&&mb_strlen($chr)==1){ if(mb_convert_kana($chr,'KV')==$chr){ return false; }else{ return true; } } } function strcnt($str){ $len = 0; for($i=0;$i<mb_strlen($str);$i++){ $chr = mb_substr($str,$i,1); if(chkhankana($chr)){ $len+=1; }else{ $len+=strlen($chr); } } return $len; } ?> <html> <head> <meta http-equiv=content-type content="text/html; charset=EUC-JP"> <title>文字列長</title> </head> <body> <form action='<?=$_SERVER['SCRIPT_NAME']?>' method='POST'> <h4>文字列長(半角英数カナは1byteでカウント)</h4> <table> <tr align="center"><th width=80>文字列</th> <td><input type="text" name="str" size="40" maxlength="20"> <input type="submit" value="Submit"></td></tr> </table> </form> <?php $str = $_POST['str']; $len = strcnt($str); print "入力文字列=[ ".$str." ]<br>\n"; print "文字列長=[ ".$len." ]<br>\n"; if($len>20) print "20 byte Over!!\n"; ?> </body> </html>

その他の回答 (2)

noname#84778
noname#84778
回答No.3

int mb_strwidth(文字列[,エンコーディング])関数を使えば 半角は文字幅1、全角は文字幅を2としてカウントしてくれますが これじゃだめですか??

  • creek
  • ベストアンサー率50% (31/61)
回答No.1

以前に同様の質問があったようですね。 ご参考までに http://oshiete1.goo.ne.jp/kotaeru.php3?q=1422920

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1422920
phptest
質問者

補足

ご回答ありがとうございます。 今回考えているのは、 半角カナだけなら、最大20文字まで入力可能で、 全角文字だけなら最大10文字まで入力可能な 形にしたいのです。 1文字ずつ文字を識別していって判断するしかないようですね。 半角カナの場合は1バイトとみなすようなことができればいいんですが。。。