Der folgende Code wird für die GB2312-Codierung verwendet, was in PHP ein Problem darstellt. Die Lösung besteht darin, zu bestimmen, ob es sich um ein Doppelbyte-Zeichen handelt, basierend darauf, ob der Wert größer oder gleich 128 ist, um verstümmelte Zeichen zu vermeiden. Es gibt jedoch immer Probleme wie die Vermischung von Chinesisch und Englisch, spezielle Symbole usw. Jetzt werde ich nur zu Referenzzwecken eine umfassendere Beschreibung schreiben
:
1. Der len-Parameter basiert auf chinesischen Zeichen. 1len entspricht 2 englischen Zeichen
2. Wenn der magische Parameter auf „false“ gesetzt ist, werden Chinesisch und Englisch gleich behandelt und die absolute Anzahl der Zeichen wird verwendet.
3. Besonders geeignet für mit htmlspecialchars() codierte Zeichenfolgen
Programmcode im
Entity-Zeichenmodus (𖰰) in GB2312 korrekt verarbeiten
:
Funktion FSubstr($title,$start,$len="",$magic=true)
{
/**
* betrieben von Smartpig
* mailto:[email protected]
*/
$länge = 0;
if($len == "") $len = strlen($title);
//Beurteilen Sie, dass die Startposition falsch ist
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) return substr($title,$start,$len
= 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;
$länge += 4;
$i += 3;
$realnum++;
if($magic)
{
$alen++;
}
}
sonst if(substr($title,$i,4) == ">")
{
$cstep = 4;
$länge += 4;
$i += 3;
$realnum++;
if($magic)
{
$alen++;
}
}
sonst if(substr($title,$i,5) == "&")
{
$cstep = 5;
$Länge += 5;
$i += 4;
$realnum++;
if($magic)
{
$alen++;
}
}
sonst if(substr($title,$i,6) == """)
{
$cstep = 6;
$länge += 6;
$i += 5;
$realnum++;
if($magic)
{
$alen++;
}
}
sonst if(substr($title,$i,6) == "'")
{
$cstep = 6;
$länge += 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;
}
}
}anders{
if(ord($cur)>=128)
{
$cstep = 2;
$länge += 2;
$i += 1;
$realnum++;
if($magic)
{
$blen++;
$ctype = 1;
}
}anders{
$cstep = 1;
$länge +=1;
$realnum++;
if($magic)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}anders{
$alen++;
}
}
}
}
if($magic)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep;
brechen;
}anders{
brechen;
}
}
}anders{
if($realnum == $len) break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);
return substr($title,$start,$length);
}
Haha, ich werde später auch den UTF-8-Codierungscode veröffentlichen.