💡 今日の3行まとめ
  • 日本語を含む文字数を数えるときは strlen() ではなく mb_strlen() を使う
  • strlen() は「バイト数」を返すため、UTF-8の日本語1文字が 3 と計算されてしまう
  • 上限文字数 - mb_strlen($文字列) を計算すれば、「あと何文字入力できるか」も1行で表示できる

1. 今日のお題とゴール

プロフィールの一言コメント(上限20文字)の文字数を数え、制限以内かどうかと「残り文字数」を画面に出力します。

  • コメント "PHPの配列と文字列を練習中!"(15文字)の文字数を正確に取得する
  • 上限(20文字)以内ならOK、超えていたらNGと判定する
  • 現在の文字数と、あと何文字入力できるかを出力する
// 期待する出力例
文字数: 15文字(上限20文字)
判定: OK(あと5文字入力できます)

2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード

❌ やりがちなNGコードBefore
<?php
$comment = 'PHPの配列と文字列を練習中!'; // 15文字
$length = strlen($comment); // ← 日本語が3倍で数えられ「39」になる!

if ($length <= 20) {
    echo "OK({$length}文字)\n";
} else {
    echo "NG:文字数オーバーです({$length}文字)\n";
}

strlen() は文字数ではなくデータの「バイト数」を数える関数です。UTF-8の日本語は1文字あたり3バイトあるため、たった15文字でも「39文字オーバー」と誤判定されてしまいます。

⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);

// 1. 入力されたコメントと上限文字数を用意する
$comment   = 'PHPの配列と文字列を練習中!';
$maxLength = 20;

// 2. mb_strlen() で日本語も「1文字=1」として正確に数える
$length    = mb_strlen($comment);
$remaining = $maxLength - $length;

// 3. 文字数と判定結果をわかりやすく出力する
echo "文字数: {$length}文字(上限{$maxLength}文字)\n";

if ($length === 0) {
    echo "判定: NG(コメントを入力してください)\n";
} elseif ($remaining >= 0) {
    echo "判定: OK(あと{$remaining}文字入力できます)\n";
} else {
    $over = abs($remaining);
    echo "判定: NG({$over}文字オーバーしています)\n";
}

3. ここだけ押さえる!3つのポイント

1日本語を扱うなら mb_strlen() を選ぶ

先頭に mb_(マルチバイト)がつく関数は、ひらがなや漢字も英数字と同じ「1文字」として数えてくれます。フォーム入力やDB保存前の文字数チェックでは、常に mb_strlen() を使いましょう。

2strlen() は半角英数字やバイト容量のチェック用

strlen() は文字の見た目ではなく「何バイトのデータか」を返す関数です。日本語が混じるテキストに使うと約3倍の数値になるため、画面の文字数カウントには向いていません。

3上限 - 文字数 で残り文字数と超過数を両方出せる

$maxLength - $length を計算しておけば、結果が0以上なら「残り文字数」、マイナスなら「超過した文字数」としてそのまま使えます。マイナス符号を消したいときは abs() で絶対値にすると表示がきれいになります。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

正解コードの $maxLength = 20; を $maxLength = 10; に書き換えて実行してみましょう。判定が NG(5文字オーバーしています) に切り替わることが確認できます。