编写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的面试题集
Nov 19 PHP
php生成缩略图的类代码
Oct 02 PHP
隐性调用php程序的方法
Mar 09 PHP
PHP采集利器 Snoopy 试用心得
Jul 03 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
php define的第二个参数使用方法
Nov 04 PHP
PHP使用Alexa API获取网站的Alexa排名例子
Jun 12 PHP
php实现cookie加密的方法
Mar 10 PHP
php程序内部post数据的方法
Mar 31 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
laravel 判断查询数据库返回值的例子
Oct 11 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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中两个float(浮点数)比较实例分析
2015/09/27 PHP
php 问卷调查结果统计
2015/10/08 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
JS array 数组详解
2009/03/22 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
编写Python的web框架中的Model的教程
2015/04/29 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python中求对数方法总结
2020/03/10 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
迪奥官网:Dior.com
2018/12/04 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
三年级评语大全
2014/04/23 职场文书
小学生环保倡议书
2014/05/15 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
滞留工资返还协议书
2014/10/19 职场文书
大学团日活动总结书
2015/05/11 职场文书
单位工作证明范本
2015/06/15 职场文书
公司财务管理制度
2015/08/04 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL