ここで行う最善の方法は、文字列を html エンティティなしで UTF-8 として保存し、エンコーディングとしてmb_*関数のファミリを使用することです。utf8
ただし、文字列が ASCII または iso-8859-1/win1252 の場合HTML-ENTITIESは、mb_string ライブラリの特別なエンコードを使用できます。
$s = 'This is my string with a special char : è - and I want it to cut in the middle of the "è" but still keeping the string intact';
echo mb_substr($s, 0, 40, 'HTML-ENTITIES');
echo mb_substr($s, 0, 41, 'HTML-ENTITIES');
ただし、基になる文字列が UTF-8 またはその他のマルチバイト エンコーディングである場合、使用HTML-ENTITIESは安全ではありません。これは、HTML-ENTITIES実際には「ハイビット文字を html エンティティとして使用する win1252」を意味するためです。これは、これがうまくいかない場合の例です。
// Assuming that é is in utf8:
mb_substr('é ', 0, 2, 'HTML-ENTITIES') === 'é'
// should be 'é '
文字列がマルチバイト エンコーディングの場合は、代わりに、分割する前にすべての html エンティティを共通のエンコーディングに変換する必要があります。例えば:
$strings_actual_encoding = 'utf8';
$s_noentities = html_entity_decode($s, ENT_QUOTES, $strings_actual_encoding);
$s_trunc_noentities = mb_substr($s_noentities, 0, 41, $strings_actual_encoding);