在 PHP 的手册上查到 mb_strlen 的返回值定义里说: ... A multi-byte character is counted as 1. 就是说,一个中文字符会统计为“1个”,跟一个英文字母是同等对待的。楼主没有说的很清楚,不过一般提这类问题的背景都是为了达到指定显示宽度的目的,而一个中文字符的显示宽度大约相当于两个英文字母,也就是说实际的要求一般应该是“每行20个中文字或者40个ASCII字符”。如果是这样的话,楼上用 mb_strlen 的方法就不好使了。———————— 基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
mb_substr 只能保证多字节字符不被切断,并不能满足美观上的需求比如在浏览器上观看时
两个小写字母与一个中文字等宽
三个大写字母与两个中文字等宽
MMM
好了
mmm
好了好像没有吧?
/*
* 截取字符串
*/
function substrs($oStr,$length,$long=false){
mb_internal_encoding('utf-8');
if($length && mb_strlen($oStr)>($length)){
$word=0.0;
while($word<$length){
if(ord($oStr[$i])>128){
$i+=strlen('中');
$word+=1.0;
}else{
$i+=1;
$word+=1.0;
$length+=0.5;
}
}
if(mb_strlen($oStr)>($length)){
if($long){
$str=mb_substr($oStr,0,intval($length+0.5));
}else{
$str=mb_substr($oStr,0,intval($length));
}
return $str.'..';
}else{
return $oStr;
}
}else{
return $oStr;
}
}
.overword {
overflow:hidden;white-space:normal; width:175px;word-break:break-all;
}
用Css吧,方便好用
{
$result = '';
while (($poz = mb_strpos(mb_strtolower($data), mb_strtolower($query))) !== false)
{
$query_len = mb_strlen ($query);
$result .= mb_substr ($data, 0, $poz).
$ins_before.
mb_substr ($data, $poz, $query_len).
$ins_after;
$data = mb_substr ($data, $poz+$query_len);
}
return $result;
}
?>mb_substr(string,start,length,Uncoding)
... A multi-byte character is counted as 1.
就是说,一个中文字符会统计为“1个”,跟一个英文字母是同等对待的。楼主没有说的很清楚,不过一般提这类问题的背景都是为了达到指定显示宽度的目的,而一个中文字符的显示宽度大约相当于两个英文字母,也就是说实际的要求一般应该是“每行20个中文字或者40个ASCII字符”。如果是这样的话,楼上用 mb_strlen 的方法就不好使了。————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)