编写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 curl参数的详解
Jun 17 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
php邮箱地址正则表达式验证
Nov 13 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
php实现文件与16进制相互转换的方法示例
Feb 16 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
自我工作评价范文
2015/03/06 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python