【PHP8.x】mb_strlen関数の使い方

作成日: 更新日:

mb_strlen関数は、指定された文字列の文字数を正確に取得する関数です。PHPの標準関数であるstrlenは、文字列に含まれるバイト数を数えます。しかし、日本語や中国語のように1文字が複数バイトで構成されるマルチバイト文字を使用する文字列の場合、strlenでは文字数ではなくバイト数が返されるため、意図した通りの結果が得られないことがあります。

このmb_strlen関数は、このようなマルチバイト文字を含む文字列を扱う際に特に役立ちます。文字列のエンコーディングを考慮して、マルチバイト文字を正確に1文字としてカウントし、実際に人間が認識する文字の総数を返します。

本関数は、数えたい文字列を最初の引数に取ります。オプションとして2番目の引数に文字列の文字エンコーディングを指定することも可能です。このエンコーディング引数を省略した場合、PHPのmb_internal_encoding()関数で設定されている内部エンコーディングが自動的に適用されます。

mb_strlen関数は、国際化されたWebアプリケーション開発において不可欠な機能です。例えば、ユーザーが入力したテキストの文字数制限を正確に行ったり、データベースへ保存する前に文字列の長さを検証したり、画面に表示する文字列の長さを調整したりする際に利用されます。これにより、世界中の多様な言語に対応した、信頼性の高い文字列処理を実現できます。この関数はPHP 8.4環境で利用できます。

基本的な使い方

構文(syntax)

mb_strlen(string $string, ?string $encoding = null): int;

引数(parameters)

string $string, ?string $encoding = null

  • string $string: 文字列の長さを取得したい対象の文字列
  • ?string $encoding = null: 文字列のエンコーディングを指定します。指定しない場合は内部エンコーディングが使用されます。

戻り値(return)

int

指定された文字列のバイト数ではなく、文字数(グリフ数)を整数で返します。

サンプルコード

PHP mb_strlenでマルチバイト文字数を正確に数える

<?php

/**
 * mb_strlen 関数は、マルチバイト文字列の文字数を正確に数えるために使用されます。
 * バイト数を数える strlen() 関数との違いを理解することが重要です。
 * 日本語のようなマルチバイト文字を含む文字列を扱う際、strlen() の結果が
 * 意図しないもの(「おかしい」と感じるもの)になるため、mb_strlen() の使用が推奨されます。
 */
function demonstrateMbStrlenUsage(): void
{
    // 日本語のマルチバイト文字列を定義
    // この文字列は7つの文字から構成されています。
    $multiByteString = "こんにちは世界!";

    echo "対象文字列: " . $multiByteString . PHP_EOL;
    echo "-----------------------------------" . PHP_EOL;

    // 1. strlen() の使用例
    // strlen() は文字列のバイト数を返します。
    // UTF-8 エンコーディングでは、日本語文字は通常1文字あたり3バイトで表現されるため、
    // 文字数とは異なる値(多くの場合、文字数より大きな値)になります。
    // これが「おかしい」と感じる原因となることがあります。
    echo "strlen() の結果 (バイト数): " . strlen($multiByteString) . PHP_EOL;

    // 2. mb_strlen() の使用例(エンコーディング自動判別)
    // mb_strlen() は文字数を返します。
    // 第二引数を省略した場合、mb_internal_encoding() の設定が使用されます。
    // 環境によっては意図しない結果になる可能性もゼロではないため、明示的な指定がより安全です。
    echo "mb_strlen() の結果 (文字数、エンコーディング自動判別): " . mb_strlen($multiByteString) . PHP_EOL;

    // 3. mb_strlen() の使用例(エンコーディング明示指定)
    // 文字列のエンコーディングを明示的に指定することで、常に正確な文字数を取得できます。
    // 特にWebアプリケーションなどで文字化けを防ぐためにも、この形式が強く推奨されます。
    echo "mb_strlen() の結果 (文字数、エンコーディング 'UTF-8' 指定): " . mb_strlen($multiByteString, 'UTF-8') . PHP_EOL;

    echo "-----------------------------------" . PHP_EOL;
    echo "【補足】" . PHP_EOL;
    echo "strlen() はバイト数を数えるため、日本語などのマルチバイト文字を含む文字列では、" . PHP_EOL;
    echo "「文字数」を数えたい場合に期待と異なる結果(例: 7文字の文字列が21と表示される)になります。" . PHP_EOL;
    echo "mb_strlen() は文字のエンコーディングを考慮して「文字数」を正確に数えます。" . PHP_EOL;
    echo "常に mb_strlen() でエンコーディングを明示的に指定 ('UTF-8' など) するのが最も安全で推奨される方法です。" . PHP_EOL;
}

// 関数を実行し、結果を出力
demonstrateMbStrlenUsage();

PHPのmb_strlen関数は、日本語のようなマルチバイト文字を含む文字列の文字数を正確に数えるために使われます。通常のstrlen関数が文字列のバイト数を数えるのに対し、mb_strlenは文字列のエンコーディングを考慮して文字数を数える点で大きく異なります。

この関数は、数えたい文字列を最初の引数に取ります。二つ目の引数はオプションで、文字列のエンコーディング(例: 'UTF-8')を指定できます。この引数を省略した場合、PHPの内部エンコーディング設定が使われますが、常に正確な結果を得るためには、明示的にエンコーディングを指定することが強く推奨されます。戻り値としては、数えられた文字数が整数で返されます。

サンプルコードでは、「こんにちは世界!」という日本語文字列を例に、strlenmb_strlenの違いを示しています。strlenでこの文字列を数えると、UTF-8エンコーディングでは日本語1文字が通常3バイトで表現されるため、文字数ではなくバイト数である21が返され、これが「おかしい」と感じる原因になります。一方、mb_strlenを使用すると、エンコーディングを考慮して正確な文字数である7が返されます。特に、二つ目の引数に'UTF-8'と明示的に指定することで、どのような環境でも意図通りの文字数を取得でき、文字化けや予期せぬ挙動を防ぐことにつながります。

システムエンジニアを目指す初心者の皆様へ。PHPで文字列の長さを扱う際、特に日本語のようなマルチバイト文字を含む場合は注意が必要です。

標準のstrlen()関数は文字列の「バイト数」を数えるため、日本語では1文字が複数バイトで表現されるため、「文字数」とは異なる結果になり、意図せず「おかしい」と感じることがあります。

これに対し、mb_strlen()関数は「文字数」を正確に数えるために使用されます。最も重要な注意点は、mb_strlen()を使う際に第二引数で文字列のエンコーディング(例: 'UTF-8')を明示的に指定することです。これを省略すると、PHPの内部設定に依存するため、環境によっては期待と異なる結果となる可能性があります。Webアプリケーションなどでは、常にエンコーディングを明示指定することで、文字化けを防ぎ、安全かつ正確に文字数を取得できますので、強く推奨いたします。

PHP mb_strlen 使えない時の安全な文字数取得

<?php

/**
 * 文字列の文字数を安全に取得します。
 * mbstring拡張が有効でない場合は、その旨を警告し、正確な文字数を提供できないことを示します。
 *
 * @param string $string 文字数を数える対象の文字列
 * @param ?string $encoding 文字エンコーディング。nullの場合は内部エンコーディングを使用
 * @return int 文字数。mbstring拡張が有効でない場合は -1 を返します。
 */
function getSafeCharacterLength(string $string, ?string $encoding = null): int
{
    // mb_strlen関数はmbstring拡張に依存しています。
    // `extension_loaded('mbstring')` で拡張がロードされているか確認します。
    if (extension_loaded('mbstring')) {
        // mbstringがロードされている場合、mb_strlenを使用して正確な文字数を取得します。
        return mb_strlen($string, $encoding);
    } else {
        // mbstringがロードされていない場合、mb_strlenは利用できません。
        // この状況は「php mb_strlen 使えない」というキーワードに該当します。
        // strlen()関数はバイト数を返すため、マルチバイト文字列では正確な文字数になりません。
        // システムエンジニアの初心者向けに、この問題を明確に伝えます。
        echo "警告: mbstring拡張がロードされていません。\n";
        echo "mb_strlen関数は利用できません。PHPのphp.iniファイルでmbstring拡張を有効にしてください。\n";
        echo "例: php.iniファイルで `extension=mbstring` の行を有効化(コメントアウトを解除)\n";
        return -1; // mb_strlenが使えないことを示すため、特別な値 -1 を返します。
    }
}

// --- サンプル使用例 ---

echo "--- mb_strlenの利用可能性チェックと文字数取得の例 ---\n\n";

// 例1: マルチバイト文字列 (日本語) の場合
$multibyteString = "こんにちは、PHPの世界!";
echo "文字列: '" . $multibyteString . "'\n";
$length1 = getSafeCharacterLength($multibyteString, 'UTF-8');

if ($length1 !== -1) {
    echo "取得された文字数 (UTF-8): " . $length1 . "\n\n";
} else {
    echo "文字数の取得に失敗しました。mbstring拡張が有効か確認してください。\n\n";
}

// 例2: シングルバイト文字列の場合
$singlebyteString = "Hello, PHP World!";
echo "文字列: '" . $singlebyteString . "'\n";
// エンコーディングをnullにすると、PHPの内部エンコーディングが使用されます。
$length2 = getSafeCharacterLength($singlebyteString); 

if ($length2 !== -1) {
    echo "取得された文字数 (デフォルトエンコーディング): " . $length2 . "\n\n";
} else {
    echo "文字数の取得に失敗しました。mbstring拡張が有効か確認してください。\n\n";
}

// このコードを実行するPHP環境でmbstring拡張が有効な場合、
// 両方の例で正確な文字数が表示されます。
// もしmbstring拡張が無効な場合、警告メッセージが表示され、
// 文字数としては -1 が返されることを確認できます。
?>

mb_strlen関数は、文字列の正確な文字数を取得するためにPHPで使用されます。特に日本語のようなマルチバイト文字を含む文字列では、バイト数を返すstrlen()関数とは異なり、この関数が文字数を正確に数えるために不可欠です。

この関数は、引数として数えたい文字列$stringと、オプションでその文字列のエンコーディング$encodingを受け取ります。$encodingを省略した場合はPHPの内部エンコーディングが適用され、戻り値は取得された文字数を示す整数です。

mb_strlenを利用するには、PHPのmbstring拡張がサーバーにインストールされ、php.iniファイルで有効になっている必要があります。提供されたサンプルコードのgetSafeCharacterLength関数は、extension_loaded('mbstring')関数を使って、この拡張が現在利用可能かを確認しています。

もしmbstring拡張が有効でない場合、mb_strlenは利用できません。この「php mb_strlen 使えない」という状況では、getSafeCharacterLength関数は警告メッセージを表示し、正確な文字数が取得できないことを示すために-1を返します。この問題を解決するには、PHPのphp.iniファイル内のextension=mbstringの行を有効化(コメントアウトを解除)し、PHPを再起動してください。

サンプルコードは、日本語のマルチバイト文字列と英語のシングルバイト文字列の両方でgetSafeCharacterLength関数を呼び出し、mbstring拡張の有効性に応じた挙動を示しています。拡張が有効な場合は正確な文字数が得られ、無効な場合は警告とともに-1が返されることを確認できます。

mb_strlen関数は、PHPのmbstring拡張が有効な環境でのみ利用できます。この拡張が有効でない場合、関数は存在せず、「php mb_strlen 使えない」という状況に直面します。その際は、PHPのphp.iniファイルでextension=mbstringの行をコメント解除して有効化する必要があります。

サンプルコードのようにextension_loaded('mbstring')で拡張の有無を確認することで、実行環境に依存せず安全に文字数を取得するコードを書くことが可能です。mbstring拡張がない状態でstrlen関数を使うと、マルチバイト文字(日本語など)の文字数ではなくバイト数を返すため、正確な文字数を取得できません。

また、mb_strlenの第二引数であるエンコーディングは、特にマルチバイト文字列を扱う場合に明示的に指定することが重要です。省略するとPHPの内部エンコーディングが使用されるため、意図しない結果を避けるためにも指定をお勧めします。サンプルコードでは拡張が利用できない場合に-1を返していますが、このように特定の戻り値でエラーを示す際は、呼び出し側で必ずその値をチェックし、適切な処理を行う実装が必要です。

PHP mb_strlenで改行文字の数え方

<?php

/**
 * mb_strlen 関数を使用して文字列の文字数を確認するサンプルコード。
 * 特に改行文字(\n, \r\n)が1文字としてカウントされることを示します。
 */
function demonstrateMbStrlenWithNewline(): void
{
    // 全角文字のみの文字列の例
    $string1 = "こんにちはPHP";
    echo "文字列1: '{$string1}'\n";
    echo "文字数 (UTF-8): " . mb_strlen($string1, 'UTF-8') . " 文字\n\n";
    // 結果: 7 (こ, ん, に, ち, は, P, H, P)

    // 半角文字のみの文字列の例
    $string2 = "Hello World!";
    echo "文字列2: '{$string2}'\n";
    echo "文字数 (UTF-8): " . mb_strlen($string2, 'UTF-8') . " 文字\n\n";
    // 結果: 12 (H, e, l, l, o,  , W, o, r, l, d, !)

    // 改行文字(UNIX形式: \n)を含む文字列の例
    $string3 = "PHPは\n素晴らしい\n言語です。";
    echo "文字列3:\n'{$string3}'\n";
    echo "文字数 (UTF-8): " . mb_strlen($string3, 'UTF-8') . " 文字\n\n";
    // 結果: 16 (P, H, P, は, \n, 素, 晴, ら, し, い, \n, 言, 語, で, す, 。)
    // ここで、各改行文字(\n)がそれぞれ1文字としてカウントされます。

    // 改行文字(Windows形式: \r\n)を含む文字列の例
    $string4 = "Windows\r\n改行です。";
    echo "文字列4:\n'{$string4}'\n";
    echo "文字数 (UTF-8): " . mb_strlen($string4, 'UTF-8') . " 文字\n\n";
    // 結果: 12 (W, i, n, d, o, w, s, \r, \n, 改, 行, で, す, 。)
    // ここで、\r (キャリッジリターン) と \n (ラインフィード) がそれぞれ1文字としてカウントされます。
}

// 関数を実行して結果を表示します
demonstrateMbStrlenWithNewline();

PHPのmb_strlen関数は、指定された文字列の文字数を数えるために利用されます。特に日本語のようなマルチバイト文字を含む文字列を扱う際に、文字コードを意識して正確な文字数を取得できる点が特徴です。

この関数の最初の引数には、文字数を数えたいstring型の文字列を渡します。2番目の引数である?string $encodingは、文字列のエンコーディング(文字コード)を指定するためのもので、通常は'UTF-8'などを指定します。この引数を省略した場合、PHPの設定で定義されている内部エンコーディングが使用されます。関数は数えられた文字数をint型の整数で返します。

サンプルコードでは、mb_strlenがどのように文字数をカウントするか、いくつかの例を通して示しています。「こんにちはPHP」のような全角文字と半角文字が混在する文字列や、「Hello World!」のような半角文字のみの文字列でも、それぞれが正しく1文字としてカウントされることがわかります。

特に重要な点として、改行文字の扱いです。UNIX系のシステムで使われる\n(ラインフィード)は、mb_strlenによって1文字としてカウントされます。一方、Windows系のシステムで使われる\r\n(キャリッジリターンとラインフィード)の場合、\r\nがそれぞれ別の文字として扱われるため、合計2文字としてカウントされます。このように、mb_strlenは改行文字も通常の文字と同様に正確に数え上げ、文字列全体の文字数を取得する際に非常に役立ちます。

mb_strlen関数は、日本語などのマルチバイト文字を正しく1文字としてカウントする際に使用します。特に注意すべきは改行文字の扱いです。UNIX形式の\nは1文字とカウントされますが、Windows形式の\r\n\r\nがそれぞれ別々に1文字とカウントされ、合計2文字となります。文字数を取得する際は、この改行文字の振る舞いを理解しておくことが重要です。また、引数$encodingを省略するとPHPの内部エンコーディングが使われるため、予期せぬ結果を防ぐために'UTF-8'などと明示的に指定することをお勧めします。これにより、コードの移植性と正確性が向上します。

【PHP8.x】mb_strlen関数の使い方 | いっしー@Webエンジニア