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编程注意事项的小结
Apr 27 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
php跨服务器访问方法小结
May 12 PHP
php简单防盗链实现方法
Jul 29 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
详解php语言最牛掰的Laravel框架
Nov 20 PHP
PHP XML Expat解析器知识点总结
Feb 15 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
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python迭代用法实例教程
2014/09/08 Python
python获取当前日期和时间的方法
2015/04/30 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
python 实现生成均匀分布的点
2019/12/05 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
animation和transition的区别
2020/10/12 HTML / CSS
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
房屋改造计划书
2014/01/10 职场文书
员工安全承诺书
2014/05/22 职场文书
地理科学专业自荐信
2014/09/01 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
基于Python编写一个监控CPU的应用系统
2022/06/25 Python