php mb strimwidth,mb_substr() 和 mb_strimwidth() 精确截取字符串

估计很多人折腾博客时都有过截断字符串的需求,比如显示文章摘要、评论输出等。

通常用到的是 mb_substr() 或 mb_strimwidth(),但是我发现,网上的很多代码并不严谨,比如很多没有加最后的编码参数,不加此参数则使用内部字符编码。

因为通常我们的文件是 UTF-8 编码的,如果内部字符编码不是 UTF-8,就很可能出问题(内部字符编码可以用 mb_internal_encoding() 设置)。

我在自己服务器(默认的内部字符编码为“ISO-8859-1”)上试了一下,详见下面的代码及结果(注释“//”后的内容为结果,其中“口”代表字符被截断后,无法正常显示的字节片段):

[ 本文假定 $str = 'qifu启福'; ]

mb_substr($str,0,4)

//qifu

mb_substr($str,0,5)

//qifu口

mb_substr($str,0,6)

//qifu口口

mb_substr($str,0,7)

//qifu启

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

//qifu启

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

//qifu启福

很明显,不指定 UTF-8 编码时,由于中文字符占三个字节,截取时很容易被拆开,一个中文字符相当于三个英文字符。而指定编码以后,才真的是按字符个数,而不是按字节数截取,mb_strimwidth() 也是一样的。

mb_substr() 截取的是字符个数,而 mb_strimwidth() 截取的是字符宽度,如下:

mb_strimwidth($str, 0, 4, '','utf-8')

//qifu

mb_strimwidth($str, 0, 5, '','utf-8')

//qifu

mb_strimwidth($str, 0, 6, '','utf-8')

//qifu启

可见 mb_strimwidth() 即不是按字节,也不是按字符截取,而是按照宽度。在 php.net 的说明中指出,多字节字符通常是单字节字符的两倍宽度,也就是说,英文字符占一个宽度,中文占两个,宽度不足以截取一个字符时则不取。

当中英文混合时,这个其实比较适合保证截取后的字符串显示宽度一致。但是,如果网页的字体并不是等宽字体,效果也就体现不出来了,因为“m”和“i”所显示的宽度很可能不一样。

另外,mb_strimwidth() 中如果指定截取后末尾添加字符串,则截取宽度包含该字符串,如下:

mb_strimwidth($str, 0, 3, '.','utf-8')

//qi.

如果使用这两个函数时,你仔细数一下输出结果,发现字符个数不太对劲,不妨根据本文所述修改代码试一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值