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

凨影 1268

/**
 * 
 * 中英混合字符串长度判断 
 * @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
    楼主,我只是来混个熟的
    广东
    这个人很有个性,连签名都没有!