编写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 相关文章推荐
ADODB类使用
Nov 25 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
php数组中删除元素的实现代码
Jun 22 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 17 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 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中的正规表达式(一)
2006/10/09 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Linux下多个Python版本安装教程
2018/08/15 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Python的形参和实参使用方式
2019/12/24 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
数学系个人求职信范文
2014/01/30 职场文书
销售总经理岗位职责
2014/03/15 职场文书
投标承诺函范文
2015/01/21 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
Python实现数据的序列化操作详解
2022/07/07 Python