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 相关文章推荐
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
PHP输出时间差函数代码
Jan 28 PHP
PHP小教程之实现链表
Jun 09 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
PHP引用的调用方法分析
Apr 25 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
php技巧小结【推荐】
Jan 19 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
laravel解决迁移文件一次删除创建字段报错的问题
Oct 24 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 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学习之整理字符串
2011/04/17 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php中JSON的使用方法
2015/04/30 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
什么是lambda函数
2013/09/17 面试题
法律七进实施方案
2014/03/15 职场文书
公司承诺书怎么写
2014/05/24 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
老舍《猫》教学反思
2016/02/17 职场文书