解説

substr関数はシングルバイトの文字列を扱う関数なので、マルチバイトの文字列を渡すと意図しない結果となってしまいます。シフトJISコードの全角文字の1文字は、内部的には2バイトとして扱われているので、開始位置の2は「い」、そこから長さ4の文字列は、全角2文字分の「いう」になります。

1文字のバイト数が異なるUTF-8コードなどの文字列を渡した場合は、さらに異なる結果となってしまいます。そこで、PHPではマルチバイト用のmb_substr関数が用意されています。

では!