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 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php中$_POST与php://input的区别实例分析
Jan 07 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
php外部执行命令函数用法小结
Oct 11 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 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 xml文件操作代码(一)
2009/03/20 PHP
php导入导出excel实例
2013/10/25 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
python快速查找算法应用实例
2014/09/26 Python
Python实现从百度API获取天气的方法
2015/03/11 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
简单了解python PEP的一些知识
2019/07/13 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
介绍一下JMS编程步骤
2015/09/22 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
刘胡兰观后感
2015/06/16 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
React Fragment介绍与使用详解
2021/11/11 Javascript
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android