编写PHP程序检查字符串中的中文字符个数的实例分享

有时候我们需要计算一个字符串中包含的字数,对于纯英文字符串,字数等于字符串长度,用
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("你是我的小苹果");
(0)

相关推荐

  • php精确的统计在线人数的方法

    这是一个非常精确的,通过php实现统计在线人数的方法,想知道怎么实现的请耐心阅读. <?php $filename='online.txt';//数据文件 $cookiename='VGOTCN_OnLineCount';//cookie名称 $onlinetime=600;//在线有效时间,单位:秒 (即600等于10分钟) $online=file($filename); //PHP file() 函数把整个文件读入一个数组中.与 file_get_contents() 类似,不同的是 fi

  • 多个PHP中文字符串截取函数

    复制代码 代码如下: <?phpfunction sysSubStr($string,$length,$append = false) {     if(strlen($string) <= $length )     {         return $string;     }     else     {         $i = 0;         while ($i < $length)         {             $stringTMP = substr($s

  • php支持中文字符串分割的函数

    str_split不支持中文,利用mb_xx函数实现个 /** * Convert a string to an array * @param string $str * @param number $split_length * @return multitype:string */ function mb_str_split($str,$split_length=1,$charset="UTF-8"){ if(func_num_args()==1){ return preg_spl

  • php实现过滤字符串中的中文和数字实例

    本文实例讲述了php实现过滤字符串中的中文和数字.分享给大家供大家参考.具体实现方法如下: function getChinese($string,$encode="GBK") { switch($encode){ case "GBK" :$codelength=2;break; case "GB2312" :$codelength=3;break; case "UTF-8" :$codelength=3;break; cas

  • php简单统计中文个数的方法

    本文实例讲述了php简单统计中文个数的方法.分享给大家供大家参考,具体如下: 之前的公司是做外贸的用到的都是英文所以统计的长度的时候是用strlen这个函数,一直也没有错误,但是现在统计中文的时候这个就出错了,现在做一下记录测试 <?php echo strlen("你好ABC") . ""; # 输出 9 echo mb_strlen("你好ABC", 'UTF-8') . ""; # 输出 5 echo mb_str

  • php封装好的人民币数值转中文大写类

    php封装好的人民币数值转中文大写类 class Num2RmbClass{ /** * 人民币数值转中文大写 * @author SunsCheung * @time 2015.11.11 * @param string $number 数值 默认为0 * @param string $int_unit 币种单位,默认"元",有的需求可能为"圆" * @param bool $is_round 是否对小数进行四舍五入 * @param bool $is_extra

  • php阿拉伯数字转中文人民币大写

    本文实例为大家分享了php阿拉伯数字转中文人民币大写的实现代码,供大家参考,具体代码如下 代码1:php阿拉伯数字转中文人民币大写,有详细的注释 /** *数字金额转换成中文大写金额的函数 *String Int $num 要转换的小写数字或小写字符串 *return 大写字母 *小数位为两位 **/ function num_to_rmb($num){ $c1 = "零壹贰叁肆伍陆柒捌玖"; $c2 = "分角元拾佰仟万拾佰仟亿"; //精确到分后面就不要了,所以

  • PHP使用redis实现统计缓存mysql压力的方法

    本文实例讲述了PHP使用redis实现统计缓存mysql压力的方法.分享给大家供大家参考,具体如下: <?php header("Content-Type:text/html;charset=utf-8"); include 'lib/mysql.class.php'; $mysql_obj = mysql::getConn(); //redis $redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); if(is

  • php中计算中文字符串长度、截取中文字符串的函数代码

    在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务器,则只要在php.ini中开启即可.如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了. 以下几个函数用起来颇为顺手的.不过要知道,得在utf-8环境下使用. 复制代码 代码如下: header('Content-type:text/html;cha

  • php将金额数字转化为中文大写

    php将金额数字转化为中文大写 echo toChineseNumber(1234567890);//壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾圆 function toChineseNumber($money){ $money = round($money,2); $cnynums = array("零","壹","贰","叁","肆","伍","陆","柒&q

  • php简单统计在线人数的方法

    本文实例讲述了php简单统计在线人数的方法.分享给大家供大家参考,具体如下: <?php //首先你要有读写文件的权限 //本程序可以直接运行,第一次报错,以缶涂梢? $online_log = "count.dat"; //保存人数的文件, $timeout = 30;//30秒内没动作者,认为掉线 $entries = file($online_log); $temp = array(); for ($i=0;$i<count($entries);$i++) { $en

  • PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数

    一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $length,要截取的字数 $encoding,网页编码,如utf-8,GB2312,GBK 实例: 复制代码 代码如下: <?php $str='我们:http://www.jb51.net'; echo mb_substr($str,0,4,'utf-8');//截取头5个字,假定此代码所在php

  • php的GD库imagettftext函数解决中文乱码问题

    本文实例讲述了php的GD库imagettftext函数解决中文乱码问题的方法.分享给大家供大家参考.具体如下: 使用imagettftext写中文时,常出现乱码问题.解决方法是将中文字符串转为utf-8格式即可.具体代码如下(文件格式为gb2312): 复制代码 代码如下: <?php $im = imagecreatefromjpeg('./1.jpg'); $w = imagesx($im); $h = imagesy($im); $green = imagecolorallocate($

随机推荐