电脑安全

您当前的位置:主页 > 电脑安全 >

PHP截取中文字符串的问题-网络编程

来源:[db:来源]标题:   字符    编辑:电脑技术全能网 时间:2019-09-18 16:51

原标题:PHP截取中文字符串的问题-网络编程
   以下代码试用于GB2312编码,截取中笔墨符串是PHP中一个头疼的成绩,处理方式是依据值能否大于即是128来推断能否是双字节字符,以幸免呈现乱码的情形。但中英文混杂、特别标记等成绩老是存在,当初写一个比拟片面的,仅供参考: 顺序阐明: 1.len参数以中笔墨符为尺度,1len即是2个英笔墨符,为了情势上难看些 2.假如将magic参数设为false,则中文和英文等同对待,取相对的字符数 3.特殊实用于用htmlspecialchars()停止过编码的字符串 4.能准确处置GB2312中实体字符形式(𖰰) 顺序代码: functionFSubstr($title,$start,$len="",$magic=true) { /** *poweredbySmartpig *mailto:d.einstein@263.net */ $length=0; if($len=="")$len=strlen($title); //推断肇端为不准确地位 if($start>0) { $cnum=0; for($i=0;$i<$start;$i++) { if(ord(substr($title,$i,1))>=128)$cnum++; } if($cnum%2!=0)$start--; unset($cnum); } if(strlen($title)<=$len)returnsubstr($title,$start,$len); $alen=0; $blen=0; $realnum=0; for($i=$start;$i<strlen($title);$i++) { $ctype=0; $cstep=0; $cur=substr($title,$i,1); if($cur=="&") { if(substr($title,$i,4)=="<") { $cstep=4; $length+=4; $i+=3; $realnum++; if($magic) { $alen++; } } elseif(substr($title,$i,4)==">") { $cstep=4; $length+=4; $i+=3; $realnum++; if($magic) { $alen++; } } elseif(substr($title,$i,5)=="&") { $cstep=5; $length+=5; $i+=4; $realnum++; if($magic) { $alen++; } } elseif(substr($title,$i,6)==""") { $cstep=6; $length+=6; $i+=5; $realnum++; if($magic) { $alen++; } } elseif(substr($title,$i,6)=="'") { $cstep=6; $length+=6; $i+=5; $realnum++; if($magic) { $alen++; } } elseif(preg_match("/&#(/d+);/i",substr($title,$i,8),$match)) { $cstep=strlen($match[0]); $length+=strlen($match[0]); $i+=strlen($match[0])-1; $realnum++; if($magic) { $blen++; $ctype=1; } } }else{ if(ord($cur)>=128) { $cstep=2; $length+=2; $i+=1; $realnum++; if($magic) { $blen++; $ctype=1; } }else{ $cstep=1; $length+=1; $realnum++; if($magic) { $alen++; } } } if($magic) { if(($blen*2+$alen)==($len*2))break; if(($blen*2+$alen)==($len*2+1)) { if($ctype==1) { $length-=$cstep; break; }else{ break; } } }else{ if($realnum==$len)break; } } unset($cur); unset($alen); unset($blen); unset($realnum); unset($ctype); unset($cstep); returnsubstr($title,$start,$length); }