网上找了找,有很多种解决函数,但要么有问题,要么就太长。
在php手册中看到了一个函数,可以正常截取长度,如下:
<?php function utf8_substr($str,$from,$len){ return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', '$1',$str); } ?>
但这个函数有一个问题,就是把中文当作一个字符来处理,并不是我需要的。通过对这个正则的分析,写了一个可以把中文字符当作两个字符来处理的函数,如下:
<?php function kc_substr($str,$from,$len){ preg_match_all('#(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+)#s',$str,$array, PREG_PATTERN_ORDER); $from1=0; $len1=0; foreach($array[0] as $key =--> $val){ $n=ord($val)>=128 ? 2:1; $from1+=$n; if($from1>$from){ $len1+=$n; if($len1<=$len){ $s.=$val; }else{ return $s.'..'; } } } return $s; } $s='中华人民共和国'; echo $s.''; echo kc_substr($s,3,8).''; ?>
函数是在UTF-8编码下测试的,ANSI下不能正常执行。