このコード
print mb_substr('éxxx', 0, 1);
空のスペースを出力します:(
最初の文字を印刷することになっていますé
。ただし、これは機能するようです。
print mb_substr('éxxx', 0, 2);
しかし、それは正しくありません。(0、2)は2文字を意味するからです...
次のように、エンコーディングパラメータをmb_substrに渡してみてください。
print mb_substr('éxxx', 0, 1, 'utf-8');
エンコーディングが自動的に検出されることはありません。
実際には、一部のシステムでは、マルチバイト関数の内部エンコーディングがデフォルトでISO-8859-1になっていることがわかりました。これにより、マルチバイトテキストを処理する能力が事実上損なわれます。
適切なデフォルトを設定すると、おそらくこれと他のいくつかの問題が修正されます。
mb_internal_encoding('UTF-8');