使用mb_substr仍然会在最后破坏重音字符

时间:2016-08-22 11:13:08

标签: php utf-8

逻辑:我从DB获取用户名,如果长度超过30,那么我会显示30个字符" ..."附在最后。 代码是

$username = htmlspecialchars($username);
if(mb_strlen($username, 'utf-8')>30){
    $username_trimmed = mb_substr($username, 0, 30, 'utf-8').'...';
}

在我的导航中,我只打印此username

<class="userName">Hello, <?php echo $username_trimmed; ?>

我的编码设置为utf-8,并在php中启用了mbstring扩展名。

上面代码的

输出:它仍然会破坏重音字符É,因为它是多字节字符,并且在中间被切断。 实际单词为MARCHÉS,输出为:
Erroneous output

问题我错过了什么? mb_substr不应该把它视为一个单一的角色,不应该阻止它在中间突破吗?

2 个答案:

答案 0 :(得分:1)

在mb_substr之后使用htmlspecialchars,而不是之前。 htmlspecialchars将字符转换为HTML实体。你不希望html实体在中间被切断。

答案 1 :(得分:0)

您的字符串实际上是"&Eacute;",而不是"É"mb_substr处理你的角色就好了,它处理HTML实体。不要在数据库中存储HTML实体,存储实际的Unicode字符。至少,在应用mb_substr之前,使用html_entity_decode($str, ENT_COMPAT, 'UTF-8')从HTML实体解码为实际字符(然后再次应用htmlspecialchars以保留HTML语法)。