设为首页 收藏本站
查看: 597|回复: 0

[经验分享] PHP UTF-8 等宽度截取中英文字符

[复制链接]

尚未签到

发表于 2017-4-10 10:51:50 | 显示全部楼层 |阅读模式
网站需要截取等宽新闻标题,对于GB编码的截取函数网上很多,没找到有适合UTF-8编码的。 考虑到UTF-8是1-4字节变长编码,虽然中文都是3字节,为了以后方便决定自己写个。
截取的变量是宽度width而不是长度length。不同中英文(包括数字)字型搭会有不同显示效果,在不同显示器上相同字型也可能会有不同效果。 需要根据实际修改 x3变量的值,x3越大则3字节编码(如中文)字符就取得越少。 全中文与全英文/数字截取显示宽度差异最大,且截取宽度值越大越明显。 中英文混排情况时差异较小。


/**
* 截取UTF8编码字符串从首字节开始指定宽度(非长度), 适用于字符串长度有限的如新闻标题的等宽度截取
* 中英文混排情况较理想. 全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.
* @param string $strUTF-8 encoding
* @param int[option] $width 截取宽度
* @param string[option] $end 被截取后追加的尾字符
* @param float[option] $x3<p>
* 3字节(中文)字符相当于希腊字母宽度的系数coefficient(小数)
* 中文通常固定用宋体,根据ascii字符字体宽度设定,不同浏览器可能会有不同显示效果</p>
*
* @return string
* @author waiting
* http://waiting.iteye.com
*/
function u8_title_substr($str, $width = 0, $end = '...', $x3 = 0) {
global $CFG; // 全局变量保存 x3 的值
if ($width <= 0 || $width >= strlen($str)) {
return $str;
}
$arr = str_split($str);
$len = count($arr);
$w = 0;
$width *= 10;
// 不同字节编码字符宽度系数
$x1 = 11;// ASCII
$x2 = 16;
$x3 = $x3===0 ? ( $CFG['cf3']  > 0 ? $CFG['cf3']*10 : $x3 = 21 ) : $x3*10;
$x4 = $x3;
// http://zh.wikipedia.org/zh-cn/UTF8
for ($i = 0; $i < $len; $i++) {
if ($w >= $width) {
$e = $end;
break;
}
$c = ord($arr[$i]);
if ($c <= 127) {
$w += $x1;
}
elseif ($c >= 192 && $c <= 223) {// 2字节头
$w += $x2;
$i += 1;
}
elseif ($c >= 224 && $c <= 239) {// 3字节头
$w += $x3;
$i += 2;
}
elseif ($c >= 240 && $c <= 247) {// 4字节头
$w += $x4;
$i += 3;
}
}
return implode('', array_slice($arr, 0, $i) ). $e;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362823-1-1.html 上篇帖子: 在线支付权威代码 Authorize.Net / PayPal PHP接口 下篇帖子: php中,高并发状态下文件的读写
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表