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&amp;java(二)
Oct 09 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
Yii2实现UploadedFile上传文件示例
Feb 15 PHP
PHP 无限级分类
May 04 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
微信推送功能实现方式图文详解
Jul 12 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 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 翻页 实例代码
2009/08/07 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
Javascript 构造函数 实例分析
2008/11/26 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
跟老齐学Python之永远强大的函数
2014/09/14 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
Python循环结构的应用场景详解
2019/07/11 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
学院书画协会部门职责
2013/11/28 职场文书
初婚初育证明
2014/01/14 职场文书
气象学专业个人求职信
2014/04/22 职场文书
社区服务标语
2014/07/01 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
大一新生检讨书
2014/10/29 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
企业工会工作总结2015
2015/05/13 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python