最好的办法是将您的字符串存储为 UTF-8 而不使用任何 html 实体,并使用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
真正的意思是“win1252 将高位字符作为 html 实体”。这是一个可能出错的示例:
// 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);