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 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
使用字符串函数输出整数化的PHP版本号
Oct 09 PHP
php 方便水印和缩略图的图形类
May 21 PHP
PHP抽象类 介绍
Jun 13 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
php+ajax无刷新上传图片的实现方法
Dec 06 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
php引用和拷贝的区别知识点总结
Sep 23 PHP
PHP isset empty函数相关面试题及解析
Dec 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
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
如何基于Python实现自动扫雷
2020/01/06 Python
python Canny边缘检测算法的实现
2020/04/24 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
现金会计岗位职责
2013/12/05 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
房产委托公证书样本
2014/04/04 职场文书
安全演讲稿大全
2014/05/09 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
关于安全的广播稿
2014/10/23 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python