网上找了找,有很多种解决函数,但要么有问题,要么就太长。 在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下不能正常执行。