スタッフブログ
PHPで文字列の文字数を数える場合,strlen関数を利用して以下のように書きます.
「テスト」は3文字なので3が返るはずです.しかし,このコードの実行結果は9が返ります.
これはstrlenがマルチバイトを考慮していない為です.strlenの場合,文字数というよりはバイト数を表示しています.
PHPでマルチバイト文字列をカウントするにはmbstringに含まれるmb_strlen関数を使います.以下はmb_stringを利用した場合のコードです.
しかし私の環境では,このコードを実行してもやはり9が返ってきました.mb_strlenは与えられた文字列を内部エンコーディングでカウントします.内部エンコーディングはmb_internal_encoding()関数を利用する事で確認できるのですが,結果はISO-8859-1でした.サーバ自体のlangはUTF-8なのであっていません.そこで以下のように書きかえました.
これでようやく3という数字がでました.mb_strlenは第二引数を指定する事で任意の文字コードとしてカウントできる為,これを利用する事でマルチバイト文字を正しくカウントできるようになります.
内部エンコーディングを正しく設定しておくのもこうならない為の対策の一つではありますが,それに加えて,mb_strlenを利用する場合は明示的にエンコードを指定しておいたほうが間違いがなくなって良いかもしれません.
php -r '$re = strlen("テスト"); var_dump($re);'
php -r '$re = mb_strlen("テスト"); var_dump($re);'
php -r '$re = mb_strlen("テスト", "UTF-8"); var_dump($re);'