PHPプロ!TIPS+

mb_strlen()関数の落とし穴

mb_strlen()関数は、日本語などのマルチバイト文字列の文字数をカウントする関数ですが、気をつけて使わないと思わぬバグの原因になってしまうことがあり ます。

<?php
$str 
'日本語にほんご';
var_dump(mb_strlen($str));
?>

このスクリプトを実行すると、多くの場合は

int(7)

と、正しい結果が表示されますが、環境によってはint(12)やint(9)など、変な値が表示されてしまう場合があります。

これは、PHPの内部エンコーディングが文字列のエンコードと異なっている時に起こります。

<?php
$str 
'日本語にほんご';
var_dump(mb_strlen($str'SJIS'));
?>

というように、mb_strlen()関数の第2引数に$strの文字エンコードを指定すると、PHPの内部エンコーディング設定に関わらず正しく動作するようになります。環境が変わったら突然おかしくなったということを防ぐためにも、第2引数で文字エンコードを指定するようにすることをお勧めします。mb_strlen()関数だけでなく、mb_strwidth()関数など、マルチバイト文字列関数はオプションの引数で文字エンコードを指定できるものが多いので気をつけてください。

このように、PHPの関数には引数がオプションとなっているものでも、指定しないと動作がおかしくなる場合があったり、指定すると大変便利に使えたりする関数がいろいろあります。マニュアルをいつもより少し詳しく見てみるだけでも、新たな発見があるかもし れません。

mb_strlen: http://www.phppro.jp/phpmanual/php/function.mb-strlen.html

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)