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读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
php 发送带附件邮件示例
Jan 23 PHP
php获取参数的几种方法总结
Feb 18 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
Feb 14 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
PHP中的表达式简述
May 29 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
PHP定义字符串的四种方式详解
Feb 06 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
Windows下安装Memcached的步骤说明
2010/04/25 PHP
PHP通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php获取字段名示例分享
2014/03/03 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
javascript中常用编程知识
2013/04/08 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
将python安装信息加入注册表的示例
2019/11/20 Python
python识别验证码的思路及解决方案
2020/09/13 Python
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
若干个Java基础面试题
2015/05/19 面试题
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
敬老月活动总结
2014/08/28 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
学校教学管理制度
2015/08/06 职场文书
python process模块的使用简介
2021/05/14 Python
Python学习之时间包使用教程详解
2022/03/21 Python