编写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 相关文章推荐
php5编程中的异常处理详细方法介绍
Jul 29 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
php设计模式 State (状态模式)
Jun 26 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 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开发框架Laravel数据库操作方法总结
2014/09/03 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python正则表达式教程之一:基础篇
2017/03/02 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
安全生产汇报材料
2014/02/17 职场文书
食品采购员岗位职责
2014/04/14 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
暑假安全保证书
2015/02/28 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
tomcat下部署jenkins的方法
2022/05/06 Servers