php 中对中英文混合字符串长度的判断及截取实例详解

凨影 1392

/**
 * 
 * 中英混合字符串长度判断 
 * @param unknown_type $str
 * @param unknown_type $charset
 */
function strLength($str, $charset = 'utf-8') {
  if ($charset == 'utf-8')
    $str = iconv ( 'utf-8', 'gb2312', $str );
  $num = strlen ( $str );
  $cnNum = 0;
  for($i = 0; $i < $num; $i ++) {
    if (ord ( substr ( $str, $i + 1, 1 ) ) > 127) {
      $cnNum ++;
      $i ++;
    }
  }
  $enNum = $num - ($cnNum * 2);
  $number = ($enNum / 2) + $cnNum;
  return ceil ( $number );
}
/**
 * 
 * 中英混合的字符串截取
 * @param unknown_type $sourcestr
 * @param unknown_type $cutlength
 */
function cut_str($sourcestr, $cutlength) {
  $returnstr = '';
  $i = 0;
  $n = 0;
  $str_length = strlen ( $sourcestr ); //字符串的字节数 
  while ( ($n < $cutlength) and ($i <= $str_length) ) {
    $temp_str = substr ( $sourcestr, $i, 1 );
    $ascnum = Ord ( $temp_str ); //得到字符串中第$i位字符的ascii码 
    if ($ascnum >= 224) //如果ASCII位高与224,
    {
      $returnstr = $returnstr . substr ( $sourcestr, $i, 3 ); //根据UTF-8编码规范,将3个连续的字符计为单个字符   
      $i = $i + 3; //实际Byte计为3
      $n ++; //字串长度计1
    } elseif ($ascnum >= 192) //如果ASCII位高与192,
    {
      $returnstr = $returnstr . substr ( $sourcestr, $i, 2 ); //根据UTF-8编码规范,将2个连续的字符计为单个字符 
      $i = $i + 2; //实际Byte计为2
      $n ++; //字串长度计1
    } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
    {
      $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
      $i = $i + 1; //实际的Byte数仍计1个
      $n ++; //但考虑整体美观,大写字母计成一个高位字符
    } else //其他情况下,包括小写字母和半角标点符号,
    {
      $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
      $i = $i + 1; //实际的Byte数计1个
      $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
    }
  }
  if ($str_length > $cutlength) {
    $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
  }
  return $returnstr;
}


联系QQ:77798085 赞助请点这里
管理员回复
    全部回复 (11)
    • 太2真人 2019-7-15
      2
      小手一抖, 金币到手!
      亚太地区
      这个人很有个性,连签名都没有!
    • latang 2019-11-1
      3
      宁可少抽一支,不可少顶一次贴。
      亚太地区
      这个人很有个性,连签名都没有!
    • 张波波 2020-2-14
      4
      楼主,我只是来混个熟的!老板,侬亿雷凑闹嫩了。
      亚太地区
      这个人很有个性,连签名都没有!
    • ggyun 2020-3-14
      5
      心随我动,想回就回。
      亚太地区
      这个人很有个性,连签名都没有!
    • iluxip 2020-3-19
      6
      沙发我没有,板凳我没有,板也没有,只好站在后面排队支持!
      亚太地区
      这个人很有个性,连签名都没有!
    • Chloe 2020-6-12
      7
      顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶!
      亚太地区
      这个人很有个性,连签名都没有!
    • 乐品集 2020-6-14
      8
      心情不好,来杯板蓝根!
      亚太地区
      这个人很有个性,连签名都没有!
    • 爱好者 2020-6-14
      9
      难得一见的好贴。。。。。。
      亚太地区
      这个人很有个性,连签名都没有!
    • 526651732qqcom 2020-6-18
      10
      楼主,我只是来混个熟的!老板,侬亿雷凑闹嫩了。
      亚太地区
      这个人很有个性,连签名都没有!
    • yqx 2020-6-19
      11
      楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见楼主的这个帖子,实在是我三生之幸啊。
      亚太地区
      这个人很有个性,连签名都没有!
    • tedabo 2022-2-26
      12
      楼主,我只是来混个熟的
      广东
      这个人很有个性,连签名都没有!