有时候需要把数据库中存储的字符串截取出一部分来显示在页面上,假如字符串的内容中英文混杂的话,可能会出现最后一个字符被截掉一半的问题,出现乱码。解决方法有这么几种:
1、直接用MySQL提供的字符串操作函数进行截取。比如用left()函数等,它就可以正确地处理中英文,按字符数进行截取,而不是按字节数进行截取。例:
select title, left(title,10) from news;
2、使用php的宽字符函数进行操作。这个需要加入宽字符的扩展支持,具体的做法是,在PHP.INI文件中,去掉mb_string.dll的注释,并重启服务器。这样就可以使用mb_substr()函数进行截取了。例:
echo mb_substr('adsf阿达都发生到访asdd', 0, 5, 'gbk');
3、使用自定义的一些函数进行处理。这些函数在网上可以搜索到,下面附两个:
function substr_cut($str_cut,$length){
if (strlen($str_cut) > $length){
for($i=0; $i < $length; $i++)
if (ord($str_cut[$i]) > 128) $i++;
$str_cut = substr($str_cut,0,$i) . "...";
}
return $str_cut;
}
或者
function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
if(function_exists("mb_substr"))
return mb_substr($str, $start, $length, $charset);
$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));
if($suffix) return $slice."…";
return $slice;
}



