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