编写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
php 保留小数点
Apr 21 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
php利用腾讯ip分享计划获取地理位置示例分享
Jan 20 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 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与javascript对多项选择的处理
2006/10/09 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
JS前端笔试题分析
2016/12/19 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
python重试装饰器示例
2014/02/11 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Python requests接口测试实现代码
2020/09/08 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
2014年母亲节演讲稿范文
2014/05/07 职场文书
写给父母的感谢信
2015/01/22 职场文书
公司管理制度范本
2015/08/03 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技