日本語の様なマルチバイト(mb)を含む文字列を対象とした関数、mb_strcut()、mb_strimwidth()、mb_strlen()、mb_substr()などを使用する際、文字数が正しくカウントされない事があります。
原因は以下から。
マルチバイトを含む文字列を対象とした関数を使用する際は、対象となる文字列のエンコードを指定する必要があります。
<?php //文字列「$str」のエンコードはSJIS $str = 'カウントする文字列'; var_dump(mb_strlen($str)); //文字コードを指定しない場合…(1) var_dump(mb_strlen($str, 'SJIS')); //文字コードを指定した場合…(2) //文字列をUTF8に変更 $str = mb_convert_encoding($str, 'UTF-8', 'SJIS'); var_dump(mb_strlen($str)); //文字コードを指定しない場合…(3) var_dump(mb_strlen($str, 'UTF-8')); //文字コードを指定した場合…(4) ?>
結果は下記の通り。
int(15) //(1)の結果、文字数は正しくない int(9) //(2)の結果、文字数は正しい int(18) //(3)の結果、文字数は正しくない int(9) //(4)の結果、文字数は正しい