Menu

PHPの文字数:strlen()とmb_strlen()、バイトと文字の違い

strlen($string)は文字列の長さをバイト数で、mb_strlen($string)は文字数で返します。日本語のテキストや絵文字で答えが変わる理由、空文字列の判定方法、入力の長さの検証方法を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

strlen($string)は文字列の長さをバイト数で返します。日本語のテキスト、アクセント付きの文字、絵文字で欲しいのは文字数なので、それにはmb_strlen($string)を使います。英語だけのテキストなら、2つは同じ数を返します。

空白、句読点、改行もすべて数えます。strlen("a b\n")は4です。

UTF-8でのバイトと文字の違い

PHPの文字列はバイトの並びで、UTF-8は文字によって使うバイト数が違います。ASCIIの英字と数字は1、éやжのような文字は2、かな、よく使う漢字、中国語の文字、€のような記号は3、ほとんどの絵文字や𠮷のような珍しい漢字は4です。strlen()はバイトを合計し、mb_strlen()は文字を数えます。

バイト数が重要なときはstrlen()を使います。バイト数で制限されたデータベースのカラム、ファイルサイズ、バイナリのプロトコルなどです。人が読むものにはmb_strlen()を使います。文字数カウンター、「最大20文字」のルール、mb_substr()でのテキストの切り詰めなどです。

絵文字と複数のコードポイントでできた文字

mb_strlen()はUnicodeのコードポイントを数えます。読む人には1文字に見えても、複数のコードポイントがつながってできているものがあります。家族の絵文字、国旗、肌の色、文字と結合用のアクセントなどです。

読む人に1文字に見えるもの(書記素クラスタ)を数えるには、intl拡張のgrapheme_strlen()が必要です。

echo grapheme_strlen('👨‍👩‍👧');   // 1
echo grapheme_strlen('🇯🇵');     // 1

日本語のフォームの文字数カウンターなら、たいていmb_strlen()で十分です。かなと漢字はどれも1つのコードポイントだからです。

mb_strwidthで表示幅を求める

ターミナルや固定幅のレイアウトでは、全角の日本語は2桁、半角カタカナやラテン文字は1桁を占めます。mb_strwidth()はその幅を返し、日本語の「全角は2文字」というルールはたいていこれを意味します。

文字列が空か確認する

いちばんわかりやすい判定は、''との厳密な比較です。strlen($s) === 0も同じ答えになります。empty($s)は同じではなく、多くのフォームで正当な答えである文字列"0"に対してもtrueを返します。

空白だけの文字列は空ではありません。空白だけなら何もないとみなすべき場合は、先にtrim()に通しましょう。

strlen(null)と文字列以外の値

strlen()は文字列を期待します。nullを渡すと今でも0を返しますが、PHP 8.1以降は非推奨の通知が表示されます。

Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /home/index.php on line 2

配列を渡すとTypeError: strlen(): Argument #1 ($string) must be of type string, array givenが投げられます。

先に値をキャストするか既定値を与えます。たとえばstrlen($value ?? '')です。整数は文字列に変換されるので、strlen(12345)は5です。配列の要素を数えるにはcount()を使います。

ユーザーの入力の長さを検証する

典型的なルールは、trimしたあとで3文字から16文字のユーザー名です。日本語の名前がバイトではなく文字で測られるよう、mb_strlen()を使います。

mb_strlen()の代わりにstrlen()を使うと、やまだたろうは6文字なのに18と数えられ、長すぎるとして拒否されてしまいます。

よくある質問

PHPで文字列の長さを取得するには?

strlen($s)はバイト数を、mb_strlen($s)は文字数を返します。英語だけのテキストなら同じですが、日本語、アクセント付きの文字、絵文字にはmb_strlen()を使います。

日本語のテキストでstrlen()が間違った長さを返すのはなぜですか?

間違っているのではなく、バイトを数えているのです。UTF-8ではかなとよく使う漢字は1文字3バイトで保存されるので、strlen('日本語')は9、mb_strlen('日本語')は3です。

絵文字を含む文字列の文字数を数えるには?

mb_strlen()はUnicodeのコードポイントを数えるので、単純な絵文字は1と数えますが、複数のコードポイントでできた絵文字(家族、国旗、肌の色)はそれより多く数えます。intl拡張のgrapheme_strlen()は、読む人に1文字に見えるものを数えます。

PHPのstrlenとcountの違いは何ですか?

strlen()は文字列の長さを測り、count()は配列の要素を数えます。PHP 8でstrlen()に配列を渡すとTypeErrorが投げられます。

PHPで文字列が空か確認するには?

空文字列と比較します:$s === ''、またはstrlen($s) === 0です。この目的にempty($s)は避けましょう。文字列"0"も空とみなしてしまいます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める