他人様が作られた PHP ソースに「文字数チェック入れてもらえますか」と依頼があったので、
$w_len = mb_strlen($word);if ($w_len > 300) {Fnc_Err_Html("エラー","文字数が300文字を超えています。(" . $w_len . "文字)" );}
とコードを追加しといたんだけど、何か、全角文字の時挙動がおかしい。
300文字を超えたらエラーになるようにしてるのに、200文字でもエラーになるし(^^;
600文字あると判断されてる様子。完全に、UTF-8 の全角1文字を3文字としてカウントしてる。コードが UTF-8 だとちゃんと認識してないから、全角1文字を構成する3バイトを3文字と判断してるんだな。
mb_strlen は第二引数に文字コードを指定できるが、指定しなきゃ内部コードを採用するはず。
ソースも UTF-8 で書かれているし、受け取るデータも UTF-8 である。なのに UTF-8 だと認識できていない・・・はぁ???
ググってみると、どうも、mb_strlen は文字コードが UTF-8 の時に限り、明示的にコードを指定しないといけないようだ・・・
明かなバグやないか(^^;
たまにしか PHP 使わないので知らんかったワ(^^;;;
$w_len = mb_strlen($word, "UTF-8");
とすれば OK であった・・・何やねん(^^;
あれこれ試した時間を返せ、こんにゃろ!(^^;
ところで、Web のフォーム入力されたデータを受け取ってるんだけど、フォームの入力中も文字数をチェックしてる。JavaScript でね。
で、JavaScript のチェックではOKになったデータが、PHP 側ではエラーになる。
どうも、JavaScript で document.form.hoge.value.length で取得すると「改行コード(CR+LF)は1文字として扱う」のに、mb_strlen は「CR と LF を1文字ずつ、計2文字として扱う」ようだ。
これも果てしなくバグ臭いのお(^^;
PHP プログラマは何も感じないのか、この仕様(^^;
まあ、これも、
$word = str_replace("\r\n", " ", $word);
してからチェックすればいいんだけど。
何だかなぁ~
<追記>
ああ、php -i してみたら、
mbstring.internal_encoding => no value => no value
になってんなあ。これだと、内部コードは ISO-8859-1 になっちゃうんかな?
ま、面倒くさがらず、mb_strlen の第二引数くらい設定しろってことやね(^^;すまん、すまん。