はじめに

文字数を数えて、文字数によって処理を変えたいということがあると思います(「何文字以上ならエラー」など)。そんなときに使える、文字列の文字数を返す関数についての覚書です。

Contents

mb_strlenの使い方

mb_strlen関数は次のように記述します。

mb_strlen(文字列, “文字コード”)

これで、指定した文字コードに従ってエンコーディングされ、文字列の文字数が返されます。
日本語では、1文字1バイトではないので、後ほど触れるstrlen関数を用いると、日本語1文字が1文字として返されませんが、この関数を使うとちゃんと日本語1文字を1文字として返してくれます。

サンプルコード

では、サンプルコードを見てみましょう。

<?php
    $moji = "サンプルコードです";
    $mojisuu = mb_strlen($moji, "UTF-8");
    echo "「".$moji."」の文字数は".$mojisuu."字です。";
?>    

出力は以下↓

ちゃんとカウントされてますね。

せっかくなのでstrlen関数

先程ちらっと出ました、strlen関数も見ておきましょう。
こちらは、文字列のバイト数を返してくれる関数です。使い方はmb_strlenとほぼ同じで、

strlen(文字列)

というように記述します。
このサンプルを、mb_strlen関数と比較して見てみましょう。

<?php
    $moji = "サンプルコードです";

    //mb_strlen関数
    $mojisuu = mb_strlen($moji, "UTF-8");
    echo "「".$moji."」の文字数は".$mojisuu."です。<br/>";

    //strlen関数
    $bytesuu = strlen($moji);
    echo "「".$moji."」のバイト数は".$bytesuu."です。";
?>    

出力はこちら↓

“;

//strlen関数
$bytesuu = strlen($moji);
echo “「”.$moji.”」のバイト数は”.$bytesuu.”です。”;
?>

!?1文字3バイトとしてカウントされていますね…。少しだけ調べると、「バイト数は文字コードに依存する」らしいです。ですので、日本語の全角を1文字2バイトとするにはstrlen関数単体ではダメ、と。文字コードとしてUTF-8を使用している場合は、SJISに変換してからカウントするなどの処理が必要だと。

これに関しては、「浜村拓夫の世界」さんの「この記事」にて詳しく説明されています。

やはり、何事も一筋縄ではいかないですね。(~_~;)

参考サイト