编写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不用内置函数对数组排序的两个算法代码
Feb 08 PHP
PHP5中使用PDO连接数据库的方法
Aug 01 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
python对数组进行反转的方法
2015/05/20 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
python使用建议与技巧分享(一)
2020/08/17 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
构造方法和其他方法的区别
2016/04/26 面试题
企业环保标语
2014/06/10 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2015年电教工作总结
2015/05/26 职场文书
小学数学教学随笔
2015/08/14 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
muduo TcpServer模块源码分析
2022/04/26 Redis