PHPのマルチバイト文字列を正しく扱う方法!初心者向けにmb_strlenとmb_substrをやさしく解説
生徒
「PHPで文字数を数えたら、ひらがなや漢字の数が合ってない気がします……」
先生
「それは『マルチバイト文字』が関係しているかもしれませんね。日本語などの文字は1文字でも複数バイトを使う場合があるんですよ。」
生徒
「バイトって何ですか?難しそうです……」
先生
「心配しなくて大丈夫です!初心者でも分かるように、PHPのmb_strlenとmb_substrを使って、正確に文字数を数えたり、部分的に取り出したりする方法をゆっくり解説しますね。」
1. マルチバイト文字列とは?
マルチバイト文字(multi-byte characters)とは、1文字を表すのに複数のバイトを使う文字のことです。バイトとは、パソコンがデータを管理する単位のことで、英語の「A」などは1バイトで済みますが、日本語の「あ」や「漢」などは2バイト以上必要
PHPでは、この違いを意識しないと、文字数を数えたり切り出したりするときにバグの原因になります。
2. strlen関数とmb_strlen関数の違い
PHPには文字列の長さを調べるstrlenという関数がありますが、これはバイト数を数える関数です。つまり、日本語では正確な文字数にならないことがあります。
$text = "こんにちは";
echo strlen($text);
15
「こんにちは」は5文字なのに「15」と出るのは、1文字が3バイトで計算されているからです。
そこで登場するのが、マルチバイト文字に対応したmb_strlenです!
$text = "こんにちは";
echo mb_strlen($text);
5
このように、mb_strlenなら日本語でも正確な「文字数」がわかります。
3. mb_strlenの使い方まとめ
mb_strlenは、次のような使い方をします:
mb_strlen(文字列, 文字コード);
第二引数の「文字コード」は"UTF-8"と書くのが一般的です。
$text = "プログラミング";
$length = mb_strlen($text, "UTF-8");
echo $length;
7
このように、日本語の文字列でも正しく文字数をカウントできます。
4. mb_substrで文字列を切り取る
今度は、文字列の一部だけを取り出したいときに使うmb_substrを紹介します。
たとえば、「プログラミング」から「グラミン」だけを取り出したい場合、mb_substrを使います。
$text = "プログラミング";
$part = mb_substr($text, 3, 4, "UTF-8");
echo $part;
グラミン
mb_substrは次のように使います:
- 第一引数:対象の文字列
- 第二引数:何文字目から始めるか(0から数える)
- 第三引数:何文字切り出すか
- 第四引数:文字コード(省略可だがUTF-8指定が安心)
5. 普通のsubstrとの違いに注意!
substrという似た関数もありますが、これもstrlenと同じくバイト単位で処理されるため、日本語では文字が切れてしまうことがあります。
$text = "こんにちは";
echo substr($text, 0, 3);
ãã
このように、意味不明な文字列になってしまうのです。日本語などマルチバイト文字列を使う場合は、必ずmb_から始まる関数を使いましょう。
6. よくある使い方:文字数制限や表示カット
ブログやコメント欄で「50文字以内に切りたい」「長すぎる文章を途中で省略したい」という場面はよくあります。そんなときにもmb_strlenとmb_substrが便利です。
$text = "この文章はとても長いので途中で切りたいと思います。";
if (mb_strlen($text, "UTF-8") > 20) {
$short = mb_substr($text, 0, 20, "UTF-8") . "…";
echo $short;
} else {
echo $text;
}
この文章はとても長いので途中…
このように、表示用に文字数をコントロールしたいときに大活躍します。
7. mb系関数を使うときの注意点
mb_strlenやmb_substrなどの「mb系関数」を使うには、PHPのマルチバイト文字列モジュール(mbstring)が有効になっている必要があります。
通常のPHP環境では有効になっていることが多いですが、mb_で始まる関数が使えない場合は、サーバーの設定やPHPの拡張モジュールを確認してみましょう。
まとめ
PHPで日本語を扱う際には、マルチバイト文字列の特性を理解し、mb_strlenやmb_substrといったmb系関数を使うことがとても重要です。特に、ひらがな・カタカナ・漢字のように、1文字が2バイト以上になる文字では、通常のstrlenやsubstrを使うと意図しない結果になってしまいます。
今回学んだmb_strlenは、文字列の正確な文字数を数えるのに最適な関数です。これはブログの文字数制限や、入力チェック、文字数カウント機能などでも活用できます。また、mb_substrは、日本語の文字列を途中から切り出すときに重宝します。表示のカットやサマリ表示など、ユーザーインターフェースを整えるうえでも欠かせません。
mb系関数は、UTF-8文字コードを正しく理解しながら使うことで、バグの少ないプログラムを実現できます。特に、日本語を正確に扱うことが求められる場面では、mbstringの拡張モジュールが必須となるため、開発環境の設定確認も大切です。
■mb_strlenとmb_substrを使った文字数チェックのサンプル
<?php
$text = "プログラミングの勉強は楽しいですね!";
// 文字数を取得
$length = mb_strlen($text, "UTF-8");
echo "文字数:" . $length . "<br>";
// 15文字を超える場合は、前半だけを表示して省略記号を追加
if ($length > 15) {
$short = mb_substr($text, 0, 15, "UTF-8") . "…";
echo "表示用:" . $short;
} else {
echo "表示用:" . $text;
}
?>
上記のように、mb_strlenとmb_substrを組み合わせることで、文字数に応じた表示処理が行えます。
日本語を含む文字列を安全かつ正確に扱うことは、ユーザー体験の向上にもつながります。
文字化けや文字切れのトラブルを防ぐためにも、マルチバイトに強いPHPのmb関数群をぜひマスターしておきましょう。
生徒
「今日の記事で、なんで普通のstrlenやsubstrでは日本語がうまく処理できないのか、すごくよく分かりました!」
先生
「そうですね。日本語は1文字が複数バイトで構成されているので、バイト単位の処理だと文字の途中で切れてしまうんです。」
生徒
「mb_strlenなら正確に文字数が数えられて、mb_substrならちゃんと日本語の一部だけを取り出せるってことですね!」
先生
「その通り!表示を短くしたり、入力文字数を制限したりする機能でも安心して使えますよ。」
生徒
「あと、UTF-8とかマルチバイトって言葉もなんとなく意味がつかめました!難しそうだったけど、身近な問題なんですね。」
先生
「ええ、特に日本語を扱うWebアプリでは避けて通れないテーマです。これをきっかけにmbstring関連の関数も覚えていきましょう!」
生徒
「ありがとうございます!次は自分でも文字制限の機能を作ってみます!」