编写PHP程序检查字符串中的中文字符个数的实例分享


Posted in PHP onMarch 17, 2016

有时候我们需要计算一个字符串中包含的字数,对于纯英文字符串,字数等于字符串长度,用
strlen函数即可获得,但如果字符串中包含中文怎办?mb_strlen可以实现,但不幸没装扩展,那就自己实现一下吧。

php有一个扩展一般是必装的,我们可以使用mb_strlen来获取字符串中的字数,用法一般如下:

$len = mb_strlen("你是我的小苹果","utf-8");

如愿获得字符串长度:7.

如果没装mb扩展呢?自己实现一下吧。

我们要先明白一个事实:字符串是由字符组成的,而字符是由字节表示的,每个英文字符是一个字节,对应一个ascii码,英文字符的ascii码是小于128的,也就是十六进制的 0x80 .当一个字节的ascii码超过了127,那就说明当前字节不是一个完整的字符。

比如

$str = "你是我的小苹果";

中的$str{0}可以取到第一个字节,我们来看一下它是啥:

php > $str = "你是我的小苹果";
php > echo $str{0};
�

是个乱码,它只是

       
字的字节之一,也就是说,

这个字符是由超过一个字节组成的,我们这样试试:
php > echo $str{0}.$str{1}.$str{2};


可以看到,将三个字节连在一起输出,就成了一个完整的


至于这里为什么是三个字节,而不是两个或4个?这个取决于字符串的编码,我这里控制台默认是utf8编码的,在PHP中,一个utf8字符是用三个字节表达的,如果是gbk编码,则会是两个字节。至于编码和字节的关系,这个话题比较大,一篇说不完,请参考这篇文章:字符编码笔记:ascii,unicode和utf8 。

知道了这些,我们就可以自己编写一个字数检查的函数了,大致流程如下:

1.for循环遍历字节 2.判断字节编码是否 >= 0x80,是的话跳过N个字节

我写了个简单的函数,可以判断gbk或utf8字符串的长度,仅供参考:

<?php

function mbstrlen($str,$encoding="utf8")
{

  if (($len = strlen($str)) == 0) {
    return 0;
  }

  $encoding = strtolower($encoding);

  if ($encoding == "utf8" or $encoding == "utf-8") {
    $step = 3;
  } elseif ($encoding == "gbk" or $encoding == "gb2312") {
    $step = 2;
  } else {
    return false;
  }

  $count = 0;
  for ($i=0; $i<$len; $i++) {
    $count++;
    //如果字节码大于127,则根据编码跳几个字节
    if (ord($str{$i}) >= 0x80) {
      $i = $i + $step - 1;//之所以减去1,因为for循环本身还要$i++
    }
  }
  return $count;
}

echo mbstrlen(iconv("utf-8","gbk","你是我的小苹果"),"gbk");
echo mbstrlen("你是我的小苹果");
PHP 相关文章推荐
PHP 和 MySQL 基础教程(二)
Oct 09 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP操作Memcache实例介绍
Jun 14 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
php实现在多维数组中查找特定value的方法
Jul 29 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
php简单处理XML数据的方法示例
May 19 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 #PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 #PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 #PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 #PHP
Symfony控制层深入详解
Mar 17 #PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 #PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 #PHP
You might like
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
PHP获取当前完整URL地址的函数
2014/12/21 PHP
php上传excel表格并获取数据
2017/04/27 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
通过实例学习Python Excel操作
2020/01/06 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
技校教师求职简历的自我评价
2013/10/20 职场文书
高校自主招生自荐信
2013/12/09 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
活动总结怎么写
2014/04/28 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript