Wenn PHP chinesische Zeichenfolgen abfängt, bestimmt es im Allgemeinen, ob es sich um ein Doppelbyte-Zeichen handelt, basierend darauf, ob der Wert größer oder gleich 128 ist, um unvollständiges Abfangen und verstümmelte Zeichen zu vermeiden.
Wenn jedoch Situationen auftreten, in denen Chinesisch und Englisch gemischt werden und spezielle Symbole enthalten sind, ist das Problem nicht so einfach zu lösen.
Das Folgende ist eine Funktion, die das Problem des chinesischen String-Abfangens umfassend löst. Freunde in Not können sich darauf beziehen.
Hinweis:
1. Der len-Parameter basiert auf 2 englischen Zeichen falsch, dann behandeln Chinesisch und Englisch die absolute Anzahl von Zeichen
3. Besonders geeignet für mit htmlspecialchars() codierte Zeichenfolgen
4 Kann den Entity-Zeichenmodus in GB2312 (??) korrekt verarbeiten >
Beispiel:
/**
@Intercept Chinesischer String, geeignet für GB2312-Kodierung
@http://www.jbxue.com
*/
function FSubstr($title,$start,$len="",$magic=true)
{
$ length = 0;
if($len == "") $len = strlen($title);
//Beurteile die Startposition auf eine falsche Position
if ($start > 0 )
{
$cnum = 0;
for($i=0;$i<$start;$i )
{
if(ord(substr ($title,$i ,1)) >= 128) $cnum ; );
}
if(strlen($title)<=$len) return substr($title,$start,$len); 🎜>$blen = 0 ;
$realnum = 0;
for($i=$start;$i
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
if($cur == "&")
{
if(substr($ title,$i,4) == "<")
{
$cstep = 4;
$length = 4;
$realnum;
if($magic)
{
$alen ;}
}
else if(substr($title,$i,4) == "> ;")
{
$cstep = 4;
$length = 4;
$i = 3;
$realnum ;
if($magic)
{
$alen;
}
else if(substr($title,$i,5) == "&")
{
$cstep = 5; $length = 5;
$i = 4;
$realnum;
if($magic)
{
$alen; == """) >{
$cstep = 6;
$i = 5;
$realnum ;
}
}
else if(substr($title,$i,6) == "'")
{
$cstep = 6
$length = 6;
$i = 5;
$realnum ;
if($magic)
{
$alen ;
}
else if(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;
$realnum ;
if($magic)
$ctype = 1;
}
}else{
$cstep = 1;
$realnum ;
if($magic)
; }
}
}
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($blen);
unset( $realnum);
unset($cstep);
return substr($title,$start,$length);