Php HtmlEntity和html_entity_decode的行为与反向行为不同

Php HtmlEntity和html_entity_decode的行为与反向行为不同,php,decode,html-entities,truncate,htmlspecialchars,Php,Decode,Html Entities,Truncate,Htmlspecialchars,我想将字符串截断为一定数量的字符。此字符串包含html字符。注意,我从字符串中删除了所有html标记。现在,如果在断点处有一个特殊字符,它不应该在HTML字符中间中断,而是在之后或之前。这些示例不起作用: //example 1 $str = "French for French is français"; $str = substr($str, 0, 27); //$str contains "French for French is fran&c"; //ex

我想将字符串截断为一定数量的字符。此字符串包含html字符。注意,我从字符串中删除了所有html标记。现在,如果在断点处有一个特殊字符,它不应该在HTML字符中间中断,而是在之后或之前。这些示例不起作用:

//example 1
$str = "French for French is français";
$str = substr($str, 0, 27);
//$str contains "French for French is fran&c";

//example 2
$str = "the en dash looks like –";
$str = substr($str, 0, 25);
//$str contains "the en dash looks like &#";
所以我认为我应该首先将特殊字符转换为单个字符,进行截断,然后将单个字符还原为特殊字符。在第一个示例中似乎有效,但在第二个示例中无效

//example 1
$str = "French for French is français";
$str = html_entity_decode($str);
$str = substr($str, 0, 27);
$str = htmlentities($str);
//$str contains "French for French is frança";

//example 2
$str = "the en dash looks like –";
$str = html_entity_decode($str);
$str = substr($str, 0, 25);
$str = htmlentities($str);
//$str contains "the en dash looks like &#";

我应该做些什么来改变这两个示例的行为方式,使其符合我的预期?

htmlentities默认情况下使用您的
default\u字符集
php.ini值进行编码。如果您没有使用支持正在转换的实体的字符集,那么它的行为可能与预期不符。试试这个,看看你是否得到了不同的结果

htmlentities($str,null,'utf-8')

html实体解码($str,null,'utf-8')

mb_substr($str,0,25,'utf-8')


查找
mb_substr
作为可能的替代谢谢,但是如果在前两个示例中用mb_substr替换substr,我会得到完全相同的结果。您是否有成功使用mb_substr和上述示例的工作示例?您需要将其与
html_entity_decode
相结合,因为即使它转换为单个字符,特殊字符的样式是多字节字符,substr会将其分割,正如您所发现的。我尝试了我的解决方案,但它不起作用,使用UTF-8时,字符编码错误
似乎不是有效的unicode字符。我确实得到了不同的结果。在上面的第三个和第四个示例中,当我将“htmlentities($str);”替换为“htmlentities($str,null,'uttf-8');”时,第一个字符串显示为空,第二个仍然输出“en-dash看起来像&#”。如果您不想每次调用都这样做,那么您也可以更新php.ini中的default_字符集,或者执行ini_set()将其设置为utf-8。我必须将ENT_QUOTES标志添加到htmlentities函数中,因为撇号/单引号没有正确转换。现在看起来是这样的:$str=html_entity_decode($str,ENT_引号| ENT_HTML401,'utf-8');