编写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 mssql 数据库分页SQL语句
Dec 16 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
ThinkPHP中U方法的使用浅析
Jun 13 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 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
YB217、YB235、YB400浅听
2021/03/02 无线电
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
php 数组的一个悲剧?
2011/05/11 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
jQuery 操作XML入门
2008/12/25 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
如何手写简易的 Vue Router
2020/10/10 Javascript
独特的python循环语句
2016/11/20 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
美国在线购物频道:Shop LC
2019/04/21 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
什么是URL
2015/12/13 面试题
弄虚作假心得体会
2014/09/10 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
2015年重阳节主持词
2015/07/04 职场文书
毕业欢送会致辞
2015/07/29 职场文书