ナビ

文字数を知る(javascriptでいうところのlength)→ mb_strlen

wrote :

ちょっとハマってしまったので備忘録。

javascriptの「length」に相当する、文字列の長さを得るphpの関数に「strlen」「mb_strlen」があることを知る。
strlenはバイト数を。mb_strlenは文字数を取得できる。
なるほど。mb_strlenで楽勝だな、と思ったが・・・。

mb_strlen('あ');

当然「1」が返ってくると思ったけど、実際は「3」が返ってきた。しかも環境によって返ってくる値が「3」だったり「2」だったり「1」だったり・・。
なぜ?
ググる。どうやら内部エンコーディングが文字列のエンコードと異なっている時に想定外の値が返ってくることが分かった。対応方法がいろいろ書かれていたが、「あ」が「2」ではなく「1」がほしい。

function getLength($str) {
 // 内部エンコーディング取得
 $org_encode = mb_internal_encoding();
 // 内部エンコーディングを文字列のエンコードに変換
 mb_internal_encoding("utf-8");
 $num = mb_strlen($str);
 // 内部エンコーディングを元に戻す
 mb_internal_encoding($org_encode);
 return $num;
}
getLength('あ');

「よし」と思ってたら、もっとシンプルな解決方法。

mb_strlen('あ', 'utf-8'); // 文字列のエンコード

って最初に気付きたかった・・・。