为了账号安全,请及时绑定邮箱和手机立即绑定

我使用substr()限制输出的字数40,可是截取的字符只有20个并出现乱码,如下:

我使用substr()限制输出的字数40,可是截取的字符只有20个并出现乱码,如下:

PHP
长风秋雁 2022-05-19 15:15:45
for ($i=0; $i<$rownum; $i++){$title=$rowdata['title'];if (strlen($title)>40){$distitle=substr($title,0,39)."…";}else{$distitle=$title;}echo "·<a href=page.php?id=".$rowdata['id']." target=_blank>".$distitle;echo "</a><br>";$rowdata=mysql_fetch_array($result);}}我使用substr()限制输出的字数40,可是截取的字符只有20个并出现乱码,如下:
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

你的$title读出来是中文的话截取40那么最终显示的只有20个文字,因为一个中文算两个字符,只有数字跟英文字母才是一个整字符
出现乱码的可能性有两种:
1 你用所截取的这个字符串里既有中文也有英文字母跟数字,那么当你截取40个字符的时候前39个字符都截取完了,当你在截取到第四十个字符时遇到的是一个中文那么就只能截取到半个字符,而一个汉字是占两个字符的,这个时候就会在你所截取出来的字符串的未尾产生乱码.
2 编辑器的编码问题.就是整个页面都会出现乱码.

下面这个函数将超过$len长度的字符串转换成以“...”结尾,并且可以避免在截取中文字符串时未尾出现乱码。
用法:$new = getsubstring($old,20);

function getsubstring($str,$len)
{
for($i = 0;$i <$end;$i++)
{
if ($i >=0 AND $i <$end)
{
if(ord(substr($str,$i,1)) > 0xa1)
$result_str.=substr($str,$i,2);
else
$result_str.=substr($str,$i,1);
}
if(ord(substr($str,$i,1)) > 0xa1)
$i++;
}
if(strlen($str)<=$end)
return $result_str;
else
return $result_str."...";
}



查看完整回答
反对 回复 2022-05-23
?
冉冉说

TA贡献1877条经验 获得超1个赞

汉字是双字节字符,substr() 是用来截取单字节字符的。

#######################################
#功能:带中文的SUBSTR函数
#入口:string
#出口:string
########################################
function csubstr($string,$sublength) {
$len = strlen($string);
if ($len <= $sublength){
$string = $string;
}else{
$string = substr($string,"0",$sublength);
$parity= 0;
for($j=0;$j<$sublength;$j++){
$temp_str=substr($string,$j,1);
if(Ord($temp_str)>127) $parity+=1;
}
if($parity%2==1) {
$string=substr($string,0,($sublength-1))."...";
} else {
$string=substr($string,0,$sublength)."...";
}
}
return $string;
}

或 使用mb_substr();



查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信