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

作成日: 更新日:

mb_strcut関数は、マルチバイト文字列を、指定されたバイト数で安全に切り取ることを実行する関数です。この関数は、日本語のようなマルチバイト文字を含む文字列を扱う際に、文字化けを防ぎながらバイト単位で正確な切り出しを行います。

第一引数に切り取り対象文字列、第二引数に切り取り開始バイト位置、第三引数に切り取るバイト長を指定します。すべてバイト単位です。オプションで文字エンコーディングを指定でき、指定しない場合はPHPの内部エンコーディングが使用されます。意図しない結果を避けるため、明示的な指定が推奨されます。

この関数の最大の特徴は、指定したバイト長で文字列を切り取る際に、マルチバイト文字が途中で途切れないように考慮する点です。切り取り位置がマルチバイト文字の途中にかかる場合、その文字は結果に含まれず、常に有効な文字列の一部が返されます。これにより、部分的な文字による文字化けを防ぎます。

mb_strcut関数は、データベースの固定長フィールドへの保存や、バイト数制限のあるAPI連携など、文字列の長さをバイト単位で管理する必要がある場面で非常に役立ちます。標準のsubstr関数がマルチバイト文字を途中で切ってしまう可能性があるのに対し、この関数は文字の完全性を保ちつつバイト数制限に対応できるため、システムの信頼性とデータの整合性を高める上で重要な役割を果たします。

基本的な使い方

構文(syntax)

<?php
$string = "日本語の文字列";
$start = 0; // 開始バイト位置
$length = 6; // 切り取るバイト数
$encoding = 'UTF-8'; // 文字エンコーディング

$result = mb_strcut($string, $start, $length, $encoding);
?>

引数(parameters)

string $string, int $start, ?int $length = null, ?string $encoding = null

  • string $string: 切り出す対象の文字列
  • int $start: 切り出し開始位置(0から始まるインデックス)
  • ?int $length: 切り出す長さを指定します。省略した場合、開始位置から文字列の末尾までを切り出します。
  • ?string $encoding: 文字エンコーディングを指定します。省略した場合、内部エンコーディングが使用されます。

戻り値(return)

string

指定された位置から指定された長さで切り出された文字列を返します。

サンプルコード

PHP mb_strcut関数でマルチバイト文字列を切り出す

<?php

declare(strict_types=1);

/**
 * mb_strcut関数の基本的な使い方を示します。
 *
 * この関数は、マルチバイト文字列を文字数ではなくバイト数で切り出します。
 * UTF-8エンコーディングでは、多くの日本語文字は3バイトで表現されます。
 */
function demonstrateMbStrCut(): void
{
    // 操作対象の文字列 (UTF-8)
    // 「あ」(3バイト), 「い」 (3バイト), 「う」 (3バイト) ...
    $string = 'あいうえお';
    $encoding = 'UTF-8';

    echo "元の文字列: " . $string . PHP_EOL;
    echo "元の文字列のバイト数: " . strlen($string) . " バイト" . PHP_EOL;
    echo "------------------------------------" . PHP_EOL;

    // ケース1: 0バイト目から6バイト分を切り出す
    // 「あ」(3バイト) + 「い」(3バイト) = 6バイト
    $cut1 = mb_strcut($string, 0, 6, $encoding);
    echo "0バイト目から6バイト切り出し: " . $cut1 . PHP_EOL; // 出力: あい

    // ケース2: 0バイト目から7バイト分を切り出す
    // 7バイト目は「う」の途中にあたるため、「う」は含まれない
    $cut2 = mb_strcut($string, 0, 7, $encoding);
    echo "0バイト目から7バイト切り出し: " . $cut2 . PHP_EOL; // 出力: あい

    // ケース3: 3バイト目(「い」の開始位置)から文字列の最後まで切り出す
    $cut3 = mb_strcut($string, 3, null, $encoding);
    echo "3バイト目から最後まで切り出し: " . $cut3 . PHP_EOL; // 出力: いうえお
}

// 関数を実行して結果を確認します
demonstrateMbStrCut();

PHPのmb_strcut関数は、日本語のように1文字が複数のバイトで構成されるマルチバイト文字列を、文字数ではなく「バイト数」で安全に切り出すために使われる関数です。通常の文字列切り出し関数では、マルチバイト文字の途中で切り取ってしまうと文字化けの原因になりますが、この関数はその問題を避けることができます。

引数には、切り出し元の文字列$string、切り出しを開始する位置をバイト数で指定する$start、切り出すバイト数を指定する$lengthを取ります。$lengthnullを指定した場合、$startから文字列の最後までが切り出されます。また、文字列のエンコーディング(例: 'UTF-8')を$encoding引数で指定することで、正確なバイト数処理が可能になります。この関数は、切り出された新しい文字列を戻り値として返します。

サンプルコードでは、「あいうえお」という文字列をUTF-8エンコーディングで扱っています。UTF-8では「あ」1文字が3バイトです。 最初の例では、0バイト目から6バイト分を切り出しており、「あ」と「い」がそれぞれ3バイトで合計6バイトとなるため、「あい」が正しく出力されます。 次の例では、0バイト目から7バイト分を切り出していますが、7バイト目は「う」の途中にあたるため、「う」は完全な文字として含まれず、結果は「あい」となります。これは、mb_strcut関数がバイト単位で厳密に切り出す特性を示しており、不完全な文字データを含まないように動作することを示しています。 最後の例では、3バイト目(「い」の開始位置)から$lengthnullにして最後まで切り出しており、「いうえお」という結果が得られます。

このようにmb_strcut関数は、データベースやネットワーク通信などでバイト数に厳密な制限がある場合に、マルチバイト文字列を正しく安全に扱う上で非常に重要な関数です。

mb_strcut関数は、マルチバイト文字列を「バイト数」で切り出す点に特に注意が必要です。日本語の文字はUTF-8エンコーディングの場合、多くが3バイトで構成されます。そのため、切り出すバイト数を指定する際に、文字の途中になるようなバイト数を指定すると、その文字は含まれずに切り捨てられます。サンプルコードのケース2のように、指定したバイト数で文字が途切れる場合、その途中の文字は結果に含まれないことを理解しておくことが重要です。また、$encoding引数には、対象文字列の正しい文字エンコーディングを必ず指定してください。誤ったエンコーディングは文字化けや予期せぬ結果を引き起こします。バイト単位での厳密な処理が必要な場合に利用し、文字単位で切り出したい場合はmb_substrなどの別の関数を検討するなど、目的に応じた適切な関数の選択が重要です。

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