mb_str~で文字列の長さと文字数を調整

strlen()

書式は「strlen(対象文字列);」です。
strlen()はデータのバイト数をカウントします。この関数はバイナリセーフです。また、もじ列以外のデータを入れると、もじ列型に置き換えます。オブジェクトであれば__toStringメソッドがコールされ、メソッドがなければE_WARNINGエラーが返されます。PHPは「__」で始まる関数名を特殊関数として予約しており、__toStringはマジックメソッドの一つです。尚、strlen()での日本語一もじは、3バイトになります。

1
2
$str="phpを使ってみる。";
echo strlen($str);
実行結果:24

mb_strlen()

書式は「mb_strlen(対象文字列 [, エンコーディング]);」です。
mb_strlen()はもじ数をカウントします。マルチバイト文字も1バイトとして処理します。第二引数を省略すると内部エンコーディングが採用されます。また、無効なエンコーディングを指定した場合は FALSE を返します。

1
2
$str="phpを使ってみる。";
echo mb_strlen($str);
実行結果:10

str_pad()

書式は「str_pad(対象文字列, 追加数 [, 追加文字, [追加方法]]);」です。
str_pad()はもじ列に文字を追加して埋めます。追加方法は、「STR_PAD_RIGHT」「STR_PAD_LEFT」「STR_PAD_BOTH」の三種類です。「STR_PAD_BOTH」は両側でかつ右から追加を始めて、左、右、左、右と順番に追加していきます。「STR_PAD_RIGHT」は右側、「STR_PAD_LEFT」左側に追加します。追加文字と追加方法を指定しなければ右側に半角スペースで埋めます。

1
2
3
4
5
6
7
8
9
10
11
12
13
$str="[AIUEO]";
echo '
<pre>'.str_pad($str, 20).'</pre>
';
echo '
<pre>'.str_pad($str, 20, "123456789").'</pre>
';
echo '
<pre>'.str_pad($str, 20, "123456789", STR_PAD_LEFT).'</pre>
';
echo '
<pre>'.str_pad($str, 20, "123456789", STR_PAD_BOTH).'</pre>
';
実行結果:

[AIUEO]             
[AIUEO]1234567891234
1234567891234[AIUEO]
123456[AIUEO]1234567

mb_strwidth()

書式は「mb_strwidth(対象文字列 [, エンコーディング]);」です。
第一引数のもじ列は、半角もじを1、全角もじを2としてカウントします。mb_strwidth()におけるマルチバイト文字は、通常シングルバイト文字の倍の幅になりますが、下記のように3バイトのマルチバイト文字が1としてカウントされる例もあります。ちなみに「ॲ」は適当に見つけたマルチバイトもじです。資産という意味があるようです。

1
2
3
echo '「ॲ」は'.strlen('ॲ').'バイトです。';
$str="ॲマルチバイト";
echo mb_strwidth($str);
実行結果:「ॲ」は3バイトです。13

mb_strimwidth()

書式は「mb_strimwidth(対象文字列, 開始位置, 幅 [, 丸めた後に最後尾へ追加する文字列, [エンコーディング]]);」です。
開始位置はもじ列を取得する際に左側で切り捨てられる分の文字数で、1バイト文字を1、マルチバイト文字を1としてカウントします。幅は1バイトを1としてカウントし、これには最後尾へ追加する文字も含まれます。幅に負の値を指定するともじ列の末尾からの幅をカウントします。

1
2
3
4
5
6
7
// マルチバイトもじで3バイトのもじの確認
echo '「ॲ」は'.strlen('ॲ').'バイトです。';
// 日本語に混ぜて他言語のマルチバイトもじを二つ入れてます。
$str="ॲマルチバイトのॲ文字を使う";
echo '開始位置を8にした場合「'.mb_strimwidth($str, 8, 6, '。').'」';
echo '開始位置を9にした場合「'.mb_strimwidth($str, 9, 6, '。').'」';
echo '開始位置を10にした場合「'.mb_strimwidth($str, 10, 6, '。').'」';
実行結果:「ॲ」は3バイトです。開始位置を8にした場合「ॲ文。」開始位置を9にした場合「文字。」開始位置を10にした場合「字を。」