mb_strlen関数でカウントした文字数がおかしく感じることがあります。ほとんどの場合、マルチバイト関数で使う文字コードの設定の問題です。php.iniの設定「mbstring.internal_encoding」をチェックしてみましょう。「mb_」で始まるマルチバイト関数の動作がおかしいときは多くの場合、これが原因です。
日本語の処理にはマルチバイト関数を使う
文字数のカウントがうまくいかない原因として、大丈夫だと思いますが念のため書いておきます。文字数のカウントなど、日本語の処理は「mb_」で始まるマルチバイト関数を使う必要があります。「mb_」が付いていないstrlen関数もありますが、次のコードは「3」ではなく「6」や「9」が返されます。結果に違和感があるでしょう。
<?php // うまくいかない処理 echo strlen("あいう"); ?>
言うまでもありませんが、この場合、strlen関数の代わりにmb_strlen関数を使います。次のコードは文字数を示す「3」が表示されます。
<?php // 文字数「3」が表示される echo mb_strlen("あいう"); ?>
マルチバイト関数には文字コード設定が必要
mb_strlen関数を使って上記のように記述しても「6」や「9」が返される場合は、PHPの設定ファイル(php.ini)を開いて、マルチバイト関数で使う文字コードが正しく設定されているか確認してみましょう。設定項目はmbstring.internal_encodingです。
mbstring.internal_encoding = UTF-8
php.iniを変更できない場合などは、マルチバイト関数のパラメータに直接指定する方法もあります。mb_strlen関数では、2番目のパラメータに文字コードを指定することができます。
mb_strlen(“あいう”, “UTF-8”)
文字コードを個別の関数で設定せずに、mb_internal_encoding関数を使ってスクリプトの先頭などで一括設定することもできます。
mb_internal_encoding(“UTF-8”);
.htaccessに記述する方法もあります。レンタルサーバーなどでphp.iniを修正できない場合には便利です。最も現実的なのはこの方法でしょうか。
php_value mbstring.internal_encoding UTF-8