ちょっとハマってしまったので備忘録。
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’); // 文字列のエンコード
って最初に気付きたかった・・・。