PHPで文字列の長さを取得したい場合はstrlen()
を使います。
ただ、日本語などのマルチバイト文字列は長さが3倍になったりするので、mb_strlen()
を使いますが、それでも文字数が狂う場合もあります。
これはPHPの設定の問題ですが、きちんとエンコード指定をすれば解決できます。
文字数を指定した数に丸める方法などもご紹介しますので、簡単に使いこなしましょう。
※本記事ではエンコードはUTF-8です。
目次
strlen関数
指定した文字列の長さを返します。(バイト数を数えます。)
strlenで文字列の長さをカウント
1 2 |
// 文字列の長さを表示させる echo strlen('straycats'); |
9
strlen()
のカッコの中の文字列'straycats'
の文字列の長さがecho
で表示されました。
strlenの構文
strlen (文字列);
strlen()
は文字が何文字かを数えるわけではなく、バイト数を数えます。
アルファベットなら基本的に1バイトなので、バイト数 = 文字数と考えてもいいでしょうが、日本語はマルチバイト文字列なので、文字数として数えると大幅に狂ってきます。
strlenで日本語を指定すると文字数が狂う
strlen()
で日本語指定すると意図しない数が返されます。
1 2 |
// 8文字の日本語文字列を指定 echo strlen('ストレイキャッツ'); |
24
日本語で8文字の文字列が24
と表示されました。
文字エンコードがUTF-8の場合、多くの日本語は1文字が3バイトとなりますが、このサンプルも以下のように判定されました。
3バイト × 8文字 = 24バイト
日本語を処理するなら、次に紹介するmb_strlen()
を使います。
mb_strlen関数
指定した文字列の文字数を返します。
mb_strlenで日本語の文字数を数える
1 2 |
// 8文字の日本語をUTF-8エンコードで数える echo mb_strlen('ストレイキャッツ', 'UTF-8'); |
8
ようやく日本語でも文字数がきちんと表示されましたね。
mb_strlenの構文
mb_strlen (文字列, (エンコード(省略可)));
エンコードを省略した場合、内部エンコードが適用されます。
mb_strlenでも文字数が狂う場合
mb_strlen()
の第二引数のエンコードを省略した場合、文字数が狂う場合があります。
1 2 |
// 8文字の日本語文字列を指定(エンコードは省略) echo mb_strlen('ストレイキャッツ'); |
24
エンコードを省略したら24文字と表示されました。
mb_strlen()
のエンコードを省略すると、php.iniの内部エンコードの設定が反映されます。
わたくしの環境では'no value'
となっていたためstrlen()
と同様の結果となってしまいました。
きちんと第二引数のエンコードを指定しましょう。
ドキュメントと異なるエンコードを指定しても狂う
コードを記載したドキュメントの文字列エンコードと、第二引数のエンコードが異なる場合、mb_strlen()
でも文字数が狂います。
1 2 3 4 |
// ドキュメントのエンコード => UTF-8 // 8文字の日本語文字列(エンコードはドキュメントと異なる 'euc' を指定) echo mb_strlen('ストレイキャッツ', 'euc'); |
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関数
長い文字列を短縮して表示させるには便利な関数ですね。
1 2 3 4 5 |
// 11文字以降は丸める(8文字+省略文字3文字) echo mb_strimwidth ('straycats-runawayboy', 0, 11, '...', 'utf8'); // 11文字以降は丸める(日本語4文字+省略文字3文字) echo mb_strimwidth('ストレイキャッツ', 0, 11,'...', 'utf8'); |
straycat…
ストレイ…
mb_strimwidth()
はアルファベットは通常の1文字分ですが、日本語だと2文字分の幅になるため注意が必要です。
mb_strimwidthの構文
mb_strimwidth (文字列, 開始位置, 丸める幅, 丸めた後の省略文字列, (エンコード(省略可)))
mb_strlen()
は以下の点に注意が必要です。
- 日本語は1文字で2文字分の幅
...
などの省略文字も丸める幅に含まれる
先頭から11文字の幅で丸める指定ですが、11文字のうち省略文字...
の3文字分も含まれます。
日本語文字列は1文字は2文字分の幅なので、4文字で8文字分の幅になります。
最後のエンコードを省略すると文字化けするので、指定するようにしましょう。