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 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
TMDPHP 模板引擎使用教程
Mar 13 PHP
配置php网页显示各种语法错误
Sep 23 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
Eclipse的PHP插件PHPEclipse安装和使用
Jul 20 PHP
PHP模板解析类实例
Jul 09 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
将PHP的session数据存储到数据库中的代码实例
Jun 24 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
总结一些PHP中好用但又容易忽略的小知识
Jun 02 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 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
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
vue3.0 上手体验
2020/09/21 Javascript
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python遍历字典方式就实例详解
2019/12/28 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
python实现tail -f 功能
2020/01/17 Python
Python request使用方法及问题总结
2020/04/26 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
新学期教师寄语
2014/04/02 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书