编写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新手上路(六)
Oct 09 PHP
php5.2.0内存管理改进
Jan 22 PHP
Mysql和网页显示乱码解决方法集锦
Mar 27 PHP
php 操作excel文件的方法小结
Dec 31 PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
PHP数学运算函数大汇总(经典值得收藏)
Apr 01 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
PHP的自定义模板引擎
Mar 24 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
用文本文件制作留言板提示(上)
2006/10/09 PHP
PHP操作文件方法问答
2007/03/16 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
python在控制台输出进度条的方法
2015/06/20 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Python 实现微信自动回复的方法
2020/09/11 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
物业保安员岗位职责
2014/03/14 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
协议书怎么写
2014/04/21 职场文书
安全保证书
2015/01/16 职场文书
委托书的样本
2015/01/28 职场文书
教师培训学习心得体会
2016/01/21 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
关于python类SortedList详解
2021/09/04 Python