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
php列出一个目录下的所有文件的代码
Oct 09 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
linux下编译安装memcached服务
Aug 03 PHP
php常用hash加密函数
Nov 22 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
php 数组字符串搜索array_search技巧
Jul 05 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
PHP架构及原理知识点详解
Dec 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
各种战术和打法的原创者
2020/03/04 星际争霸
php下实现折线图效果的代码
2007/04/28 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
JavaScript 事件系统
2010/07/22 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python with用法实例
2015/04/14 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
一百行python代码将图片转成字符画
2021/02/19 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
Python中zip函数如何使用
2020/06/04 Python
详解Python设计模式之策略模式
2020/06/15 Python
Numpy 多维数据数组的实现
2020/06/18 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
销售内勤岗位职责
2014/04/15 职场文书
文秘个人求职信范文
2014/04/22 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
委托书如何写
2014/08/30 职场文书
初婚未育证明样本
2014/10/24 职场文书
酒店前台辞职书
2015/02/26 职场文书
5个实用的JavaScript新特性
2022/06/16 Javascript