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 相关文章推荐
用Flash图形化数据(二)
Oct 09 PHP
在Windows版的PHP中使用ADO
Oct 09 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
PHP程序员最常犯的11个MySQL错误小结
Nov 20 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php中array_unshift()修改数组key注意事项分析
May 16 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
Yii2创建多界面主题(Theme)的方法
Oct 08 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 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中var_export与var_dump的区别分析
2010/08/21 PHP
php url路由入门实例
2014/04/23 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
jQuery的deferred对象使用详解
2011/08/20 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
用pycharm开发django项目示例代码
2018/10/24 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
python多任务之协程的使用详解
2019/08/26 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
小学生开学感言
2014/02/28 职场文书
后备干部培训方案
2014/05/22 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
实习单位指导教师评语
2014/12/30 职场文书
五一晚会主持词
2015/07/01 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python