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

他人様が作られた 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 の第二引数くらい設定しろってことやね(^^;すまん、すまん。
Clip to Evernote

トラックバック(0)

このブログ記事を参照しているブログ一覧: UTF-8 で mb_strlen 使う時は明示的に文字コードを指定しないといかんのね

このブログ記事に対するトラックバックURL: http://blog.netandfield.com/mt/mt-tb.cgi/2834

コメントする

このブログ記事について

このページは、shinodaが2014年1月21日 14:33に書いたブログ記事です。

ひとつ前のブログ記事は「廿日市のオールスターズというバンドが良かったわあ」です。

次のブログ記事は「俺の時代の祖生東小学校校歌を GarageBand で再現してみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら