js和php字符串长度不同,记一次js中和php中的字符串长度计算截取的终极问题和完美解决方案...

本文探讨了JavaScript和PHP中计算字符串长度的差异,特别是在处理Unicode字符时。针对JavaScript,提出了一种通过遍历charCodeAt来计算字符串宽度的方案;而对于PHP,利用mb_substr从字符串尾部截取并比较长度变化来实现宽度计算。同时,给出了一个PHP的字符串截取函数,确保在长度限制下能合理显示省略号。
摘要由CSDN通过智能技术生成

1.js是用unicode算长度的,比如单字节的算1,中文也算1,但是正常我们想让两个单字节算1,如何计算这个长度

第一种解决方案,用正则,如下 /[\u0x00-\u0xff]/,天真的想着,这样就可以匹配所有unicode在这个之间的了,但是,这个正则不匹配标点符号,比如空格,逗号,不知道为什么,所以,只能去遍历charCodeAt了 代码如下:

function getStringWidth(s){

var length = 0;

for(var i=0;i

if(s.charCodeAt(i)>255) {

length++;

} else {

length += 0.5;

}

}

return Math.ceil(length);

}

2.php的长度要分编码的,我只说utf8,写php还gbk的,我就不说什么了

如何计算长度呢?

正则?[x00-xff]这玩意不匹配空格逗号,不能像js那样用ord来算,因为ord只计算一个字节

这儿有个极品的办法,我用mb_substr从字符串的尾部每次截一个,然后判断截完之后和截之前的长度差,如果差1那么长度就+0.5,大于1那么长度就+1,最终取个ceil,完美解决,代码如下:

function get_string_width($s) {

$length = 0;

while(strlen($s)>0) {

$old_length = strlen($s);

$s = mb_substr($s, 0,-1,'utf8');

if(($old_length-strlen($s))==1) {

$length += 0.5;

} else {

$length += 1;

}

}

return ceil($length);

}

测试完毕,符合要求

3。截取

function cut_string($s,$l=140) {

$length = get_string_width($s);

if($length>$l) {

while(get_string_width($s.'...')<=$l) {

$s = mb_substr($s, 0,-1,'utf8');

}

$s .= '...';

}

return $s;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值