日期:2014-05-17 浏览次数:20532 次
//中文字符串截取无乱码函数
function cut_str($string, $start, $length) {
if(strlen($string)>$length){
$str = null;
$len = $start+$length;
for($i=$start;$i<$len;$i++){
if(ord(substr($string,$i,1))>0xa0){
$str.=substr($string,$i,2);
$i++;
}else{
$str.=substr($string,$i,1);
}
}
return $str.'...';
}else{
return $string;
}
}
$str = "利用滤镜及图层样式制作逼真的石块字"; cut_str($str,0,50);
/****************************
* subCNchar() 截取汉字 *
* [$str] [要截取的字符串]
* [$start] [截取的起始位置]
* [$length] [要截取的长度]
* [$charset] [字符串编码]
****************************/
function subCNchar($str, $start = 0, $length, $charset = "utf-8") {
if (strlen($str) <= $length)
return $str;
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("", array_slice($match[0], $start, $length));
return $slice;
}
------解决方案--------------------
为什么不能在后面加上.....
echo mb_strlen($str,'utf-8')>10 ? mb_substr($str,0,10,'utf-8').'...' : $str;
------解决方案--------------------
加"..."见12楼,
如果你非要改这个函数,utf8的编码很有规律,就是下面几种,除ascii码部分外,
第一个字节都是11开头,连续的1的个数代表了总字节数,后续字节都是10开头
其中汉字基本在3个字节的区.
知道了这个规律,写个函数应该很容易吧?
U+007F 0xxxxxxx
U+07FF 110xxxxx 10xxxxxx
U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U+3FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx