PHPで文字数(文字列の長さ)と日本語の文字数を取得(strlen,mb_strlen)

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PHPで文字列の長さを取得したい場合はstrlen()を使います。

ただ、日本語などのマルチバイト文字列は長さが3倍になったりするので、mb_strlen()を使いますが、それでも文字数が狂う場合もあります。

これはPHPの設定の問題ですが、きちんとエンコード指定をすれば解決できます。

文字数を指定した数に丸める方法などもご紹介しますので、簡単に使いこなしましょう。

※本記事ではエンコードはUTF-8です。

 

strlen関数

指定した文字列の長さを返します。(バイト数を数えます。)

strlenで文字列の長さをカウント

9

strlen()のカッコの中の文字列'straycats'の文字列の長さがechoで表示されました。

strlenの構文

strlen (文字列);

strlen()は文字が何文字かを数えるわけではなく、バイト数を数えます。

アルファベットなら基本的に1バイトなので、バイト数 = 文字数と考えてもいいでしょうが、日本語はマルチバイト文字列なので、文字数として数えると大幅に狂ってきます。

strlenで日本語を指定すると文字数が狂う

strlen()で日本語指定すると意図しない数が返されます。

24

日本語で8文字の文字列が24と表示されました。

文字エンコードがUTF-8の場合、多くの日本語は1文字が3バイトとなりますが、このサンプルも以下のように判定されました。

3バイト × 8文字 = 24バイト

日本語を処理するなら、次に紹介するmb_strlen()を使います。

mb_strlen関数

指定した文字列の文字数を返します。

mb_strlenで日本語の文字数を数える

8

ようやく日本語でも文字数がきちんと表示されましたね。

mb_strlenの構文

mb_strlen (文字列, (エンコード(省略可)));

エンコードを省略した場合、内部エンコードが適用されます。

mb_strlenでも文字数が狂う場合

mb_strlen()の第二引数のエンコードを省略した場合、文字数が狂う場合があります。

24

エンコードを省略したら24文字と表示されました。

mb_strlen()のエンコードを省略すると、php.iniの内部エンコードの設定が反映されます。

わたくしの環境では'no value'となっていたためstrlen()と同様の結果となってしまいました。

きちんと第二引数のエンコードを指定しましょう。

ドキュメントと異なるエンコードを指定しても狂う

コードを記載したドキュメントの文字列エンコードと、第二引数のエンコードが異なる場合、mb_strlen()でも文字数が狂います。

16

ドキュメントのエンコードはUTF-8で、mb_strlen()のエンコードを'euc'とすると、文字数が16文字と2倍になりました。

日本語でもshift_jisやeucのエンコードだと1文字2バイトですが、UTF-8は3バイトがメインなので、文字数が狂ってしまいます。

エンコードはドキュメントと合わせて指定しましょう。

 

ちなみに、webのエンコードは以前はshift_jisが主流でしたが、現在ではUTF-8が主流となっています。

特別な理由がなければ、UTF-8で統一してしまいましょう。

文字数を指定した幅で丸める

mb_strimwidth()を使えば、文字数を指定した幅に丸めることができます。

mb_strimwidth関数

長い文字列を短縮して表示させるには便利な関数ですね。

straycat…
ストレイ…

mb_strimwidth()はアルファベットは通常の1文字分ですが、日本語だと2文字分の幅になるため注意が必要です。

mb_strimwidthの構文

mb_strimwidth (文字列, 開始位置, 丸める幅, 丸めた後の省略文字列, (エンコード(省略可)))

mb_strlen()は以下の点に注意が必要です。

  • 日本語は1文字で2文字分の幅
  • ...などの省略文字も丸める幅に含まれる

先頭から11文字の幅で丸める指定ですが、11文字のうち省略文字...の3文字分も含まれます。

日本語文字列は1文字は2文字分の幅なので、4文字で8文字分の幅になります。

 

最後のエンコードを省略すると文字化けするので、指定するようにしましょう。

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*