逻辑:我从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
,输出为:
问题我错过了什么? mb_substr
不应该把它视为一个单一的角色,不应该阻止它在中间突破吗?
答案 0 :(得分:1)
在mb_substr之后使用htmlspecialchars,而不是之前。 htmlspecialchars将字符转换为HTML实体。你不希望html实体在中间被切断。
答案 1 :(得分:0)
您的字符串实际上是"É"
,而不是"É"
。 mb_substr
处理你的角色就好了,它不处理HTML实体。不要在数据库中存储HTML实体,存储实际的Unicode字符。至少,在应用mb_substr
之前,使用html_entity_decode($str, ENT_COMPAT, 'UTF-8')
从HTML实体解码为实际字符(然后再次应用htmlspecialchars
以保留HTML语法)。