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.ini中文版
Oct 09 PHP
用php+javascript实现二级级联菜单的制作
May 06 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
php 读取文件头判断文件类型的实现代码
Aug 05 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
php限制文件下载速度的代码
Oct 20 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 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
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
PHP中cookie知识点学习
2018/05/06 PHP
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
Python解析json文件相关知识学习
2016/03/01 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
Django实现分页功能
2018/07/02 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
python使用配置文件过程详解
2019/12/28 Python
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
致铅球运动员广播稿精选
2014/01/12 职场文书
感恩节活动方案
2014/01/27 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
物理学专业求职信
2014/07/04 职场文书
优秀纪检干部材料
2014/08/27 职场文书
个人催款函范文
2015/06/23 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
外出考察学习心得体会
2016/01/18 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL