欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

utf编码的中文字符串截取处理(避免截取半字/乱码的情况) PHP 

程序员文章站 2022-07-15 08:46:29
...
如下代码实现对utf-8编码的中文字符串进行截取,并在字符串长度超过截取长度时补上"..."省略号(网络上搜到的代码在判断的条件上有点小bug,这里做了修正).
关于utf-8编码的详细资料,参看UTF-8
<?php  
  function cutstr($sourcestr, $cutlength){
    $returnstr = ''; 
    $i = 0; 
    $n = 0; 
    $str_length = strlen($sourcestr);                      //字符串的字节数 
    while(($n < $cutlength) && ($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
      }
      else if($ascnum >= 192){                             //如果ASCII位高与192,
        $returnstr = $returnstr.substr($sourcestr, $i, 2); //根据UTF-8编码规范,将2个连续的字符计为单个字符 
        $i = $i + 2;                                       //实际Byte计为2
        $n ++;                                             //字串长度计1
      }
      else if($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 > $i){                                  //$str_length > $cutlength?
      $returnstr = $returnstr."...";                       //超过长度时在尾处加上省略号
    }
    return $returnstr;
  }
相关标签: PHP