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 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
php中文本数据翻页(留言本翻页)
Oct 09 PHP
php SQL之where语句生成器
Mar 24 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
使用php判断服务器是否支持Gzip压缩功能
Sep 24 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
PHP7多线程搭建教程
Apr 21 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 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静态变量当缓存的方法
2013/11/13 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
Python中的推导式使用详解
2015/06/03 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
浅析python继承与多重继承
2018/09/13 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
Python可迭代对象操作示例
2019/05/07 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
青年文明号事迹材料
2014/01/18 职场文书
对公司合理化的建议书
2014/03/12 职场文书
结对共建工作方案
2014/06/02 职场文书
横幅标语大全
2014/06/17 职场文书
违章停车检讨书
2014/10/21 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS