電気ウナギ的○○

About Home

UTF-8 で mb_strlen 使う時は明示的に文字コードを指定しないといかんのね

shinoda (2014年1月21日 14:33)
他人様が作られた 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 の第二引数くらい設定しろってことやね(^^;すまん、すまん。

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(0)

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/2834

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE