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模板类代码
Sep 07 PHP
关于svn冲突的解决方法
Jun 21 PHP
php实现将字符串按照指定距离进行分割的方法
Mar 14 PHP
PHP程序员的技术成长规划
Mar 25 PHP
php中static和const关键字用法分析
Dec 07 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
Mar 14 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 PHP
PHP类的自动加载机制实现方法分析
Jan 10 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
Feb 28 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 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/01/06 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
PHP写日志的实现方法
2014/11/05 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
Add a Formatted Table to a Word Document
2007/06/15 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
vue实现购物车加减
2020/05/30 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
Python实现telnet服务器的方法
2015/07/10 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python3实现单目标粒子群算法
2019/11/14 Python
django配置app中的静态文件步骤
2020/03/27 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
质检部经理岗位职责
2014/02/19 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
大学生求职计划书
2014/04/30 职场文书
小学数学教研活动总结
2014/07/01 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
回复函格式及范文
2015/07/14 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记