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 相关文章推荐
PHP新手上路(十三)
Oct 09 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
php获取bing每日壁纸示例分享
Feb 25 PHP
PHPExcel内存泄漏问题解决方法
Jan 23 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
php操作access数据库的方法详解
Feb 22 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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中使用Oracle数据库(6)
2006/10/09 PHP
php debug 安装技巧
2011/04/30 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
使用Python监控文件内容变化代码实例
2018/06/04 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
Android笔试题总结
2014/11/29 面试题
介绍一下RMI的基本概念
2016/12/17 面试题
研究生求职推荐信范文
2013/11/30 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
打架检讨书300字
2014/02/02 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
人事部专员岗位职责
2014/03/04 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
关于做家务的心得体会
2016/01/23 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
员工安全责任协议书
2016/03/22 职场文书
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js