《PHP8上級試験対策》trim()関数とマルチバイト文字の落とし穴

  • URLをコピーしました!

はじめに

PHPのtrim()関数は、文字列の先頭と末尾から指定した文字を削除する便利な関数です。ただし、UTF-8などマルチバイト文字列を扱う場合には思わぬ落とし穴があります。本記事では試験で狙われやすい基本仕様と、実務で注意すべきマルチバイト時の挙動について解説します。

キーワード: trim / マルチバイト / UTF-8 / 文字化け

目次

基本仕様(教科書的な動作)

trim(string $string, string $characters = " \n\r\t\v\x00"): string
  • デフォルトでは空白・改行・タブなどを削除する。
  • 第二引数 $characters で削除対象文字を指定できる。

ソースコード例1

<?php
declare(strict_types=1);
error_reporting(-1);

$s = 'あいういあ';
var_dump(trim($s, 'あ'));

理想的な説明

  • 先頭と末尾の「あ」が削除されて → "いうい"
  • UTF-8では「あ」「い」「う」1文字が3バイトなので → string(9) "いうい"

実際の挙動(UTF-8での落とし穴)

実際に上記コードを実行すると、結果は次のようになります。

string(7) "�うい"

なぜでしょうか?

  • 「あ」= E3 81 82(UTF-8で3バイト)
  • 第二引数 'あ' は「E3, 81, 82 の各バイト」を削除対象にする
  • そのため、先頭と末尾の「あ」は消えるが、中央の「い」(E3 81 84)の先頭バイト E3 も削られ、結果的に文字化けする

ポイントtrim()は「文字」ではなく「バイト集合」として判定を行うため、マルチバイト文字を扱うと文字化けが起こりやすいのです。

安全な代替方法

マルチバイト文字を正しく扱いたい場合は、mbstringや正規表現を利用します。

ソースコード例2(正規表現で両端の「あ」を削除)

<?php
declare(strict_types=1);
error_reporting(-1);

$s = 'あいういあ';
$result = preg_replace('/^(あ)+|(あ)+$/u', '', $s);
var_dump($result); // string(9) "いうい"

この方法なら、期待通り「いうい」が得られます。

試験対策のポイント

  • trim() の第二引数は「文字集合」ではなく「バイト集合」扱い
  • マルチバイト文字を渡すと意図しない動作(文字化け)が起こり得る
  • 試験では「両端の指定文字を削除する」という基本動作を押さえつつ、実務ではマルチバイト非対応に注意

まとめ

  • trim()は便利だが、マルチバイト文字を含む場合は挙動に注意
  • 教科書的には「両端の指定文字を削除」だが、実際には「バイト単位処理」
  • 日本語などマルチバイトを扱う場合は mbstringpreg_replace を利用することが推奨される

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次