php截取字符串之截取utf8或gbk编码的中英文字符串示例


Posted in PHP onMarch 12, 2014

微博的发言有字数限制,其计数方式是,中文算2个,英文算1个,全角字符算2个,半角字符算1个。
php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求。
mb_strlen 可以根据字符集计算长度,比如utf8的中文计数为1,但这不符合微博字数限制需求,中文必须计算为2才可以。
google了下,找到一个discuz中截取各种编码字符的类,改造了下,已经测试通过.其中参数$charset 只支持gbk与utf-8。

$a = "s@@你好";
var_dump(strlen_weibo($a,'utf-8'));

结果输出为8,其中字母s计数为1,全角@计数为2,半角@计数为1,两个中文计数为4。源码如下:

function strlen_weibo($string, $charset='utf-8')
{
    $n = $count = 0;
    $length = strlen($string);
    if (strtolower($charset) == 'utf-8')
    {
        while ($n < $length)
        {
            $currentByte = ord($string[$n]);
            if ($currentByte == 9 ||
                $currentByte == 10 ||
                (32 <= $currentByte && $currentByte <= 126))
            {
                $n++;
                $count++;
            } elseif (194 <= $currentByte && $currentByte <= 223)
            {
                $n += 2;
                $count += 2;
            } elseif (224 <= $currentByte && $currentByte <= 239)
            {
                $n += 3;
                $count += 2;
            } elseif (240 <= $currentByte && $currentByte <= 247)
            {
                $n += 4;
                $count += 2;
            } elseif (248 <= $currentByte && $currentByte <= 251)
            {
                $n += 5;
                $count += 2;
            } elseif ($currentByte == 252 || $currentByte == 253)
            {
                $n += 6;
                $count += 2;
            } else
            {
                $n++;
                $count++;
            }
            if ($count >= $length)
            {
                break;
            }
        }
        return $count;
    } else
    {
        for ($i = 0; $i < $length; $i++)
        {
            if (ord($string[$i]) > 127)
            {
                $i++;
                $count++;
            }
            $count++;
        }
        return $count;
    }
}
PHP 相关文章推荐
一个颜色轮换的简单例子
Oct 09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
PHP中FTP相关函数小结
Jul 15 PHP
Yii2实现中国省市区三级联动实例
Feb 08 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
PHP批斗大会之缺失的异常详解
Jul 09 PHP
如何理解PHP核心特性命名空间
May 28 PHP
php实现快速排序的三种方法分享
Mar 12 #PHP
php二分查找二种实现示例
Mar 12 #PHP
php遍历文件夹和文件列表示例分享
Mar 11 #PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 #PHP
php上传图片存入数据库示例分享
Mar 11 #PHP
php使用反射插入对象示例分享
Mar 11 #PHP
php数组编码转换示例详解
Mar 11 #PHP
You might like
php选择排序法实现数组排序实例分析
2015/02/16 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
jquery常用操作小结
2014/07/21 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
js实现抽奖功能
2020/11/24 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Python中Yield的基本用法
2020/10/18 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
法律专业实习鉴定
2013/12/22 职场文书
文秘专业个人求职信
2013/12/22 职场文书
求职信范文怎么写
2014/01/29 职场文书
文明城市标语
2014/06/16 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
公务员考察材料
2014/12/23 职场文书
认真学习保证书
2015/02/26 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
机关保密工作承诺书
2015/05/04 职场文书