编写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开发工具之vs2005图解
Jan 12 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
深入PHP数据缓存的使用说明
May 10 PHP
基于PHP文件操作的详解
Jun 05 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
PHP列出MySQL中所有数据库的方法
Mar 12 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 PHP
PHP实现权限管理功能示例
Sep 22 PHP
php如何比较两个浮点数是否相等详解
Feb 12 PHP
PHP使用非对称加密算法RSA
Apr 21 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
python实现SOM算法
2018/02/23 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
python3排序的实例方法
2020/10/20 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
超市仓管员岗位职责
2014/04/07 职场文书
调解协议书
2014/04/16 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
python如何利用traceback获取详细的异常信息
2021/06/05 Python