Le code suivant est utilisé pour l'encodage GB2312. L'interception de chaînes chinoises est un casse-tête en PHP. La solution consiste à déterminer s'il s'agit d'un caractère à deux octets en fonction du fait que la valeur est supérieure ou égale à 128 pour éviter les caractères tronqués. Cependant, des problèmes tels que le mélange du chinois et de l'anglais, des symboles spéciaux, etc. existent toujours. Je vais maintenant en écrire un plus complet à titre de référence uniquement :
Description du programme :
1. Le paramètre len est basé sur des caractères chinois. 1len est égal à 2 caractères anglais afin de rendre le formulaire plus beau.
2. Si le paramètre magique est défini sur false, le chinois et l'anglais seront traités de la même manière et le nombre absolu de caractères sera pris en compte.
3. Particulièrement adapté aux chaînes codées avec htmlspecialchars()
code de programme
du mode caractère d'entité (𖰰)
dans GB2312 :
fonction FSubstr($title,$start,$len="",$magic=true)
{
/**
* propulsé par Smartpig
* mailto:[email protected]
*/
$longueur = 0 ;
if($len == "") $len = strlen($title);
//Juger que la position de départ est incorrecte
si($début > 0)
{
$cnum = 0 ;
pour($i=0;$i<$start;$i++)
{
if(ord(substr($titre,$i,1)) >= 128) $cnum ++;
}
if($cnum%2 != 0) $start--;
unset($cnum);
}
if(strlen($title)<=$len) return substr($title,$start,$len
$alen = 0;
$blen = 0;
$realnum = 0;
pour($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cpas = 0 ;
$cur = substr($titre,$i,1);
si($cur == "&")
{
if(substr($titre,$i,4) == "<")
{
$cétape = 4 ;
$longueur += 4 ;
$je += 3 ;
$numéroréel++;
si ($ magique)
{
$alen++;
}
}
sinon if(substr($title,$i,4) == ">")
{
$cétape = 4 ;
$longueur += 4 ;
$je += 3 ;
$numéroréel++;
si ($ magique)
{
$alen++;
}
}
sinon if(substr($title,$i,5) == "&")
{
$cétape = 5 ;
$longueur += 5 ;
$je += 4 ;
$numéroréel++;
si ($ magique)
{
$alen++;
}
}
sinon if(substr($titre,$i,6) == """)
{
$cétape = 6 ;
$longueur += 6 ;
$je += 5 ;
$numéroréel++;
si ($ magique)
{
$alen++;
}
}
sinon if(substr($title,$i,6) == "'")
{
$cétape = 6 ;
$longueur += 6 ;
$je += 5 ;
$numéroréel++;
si ($ magique)
{
$alen++;
}
}
sinon if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$longueur += strlen($match[0]);
$i += strlen($match[0])-1;
$numéroréel++;
si ($ magique)
{
$blen++;
$ctype = 1;
}
}
}autre{
si(ord($cur)>=128)
{
$cétape = 2 ;
$longueur += 2 ;
$je += 1 ;
$numéroréel++;
si ($ magique)
{
$blen++;
$ctype = 1;
}
}autre{
$cétape = 1 ;
$longueur +=1 ;
$numéroréel++;
si ($ magique)
{
si(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}autre{
$alen++;
}
}
}
}
si ($ magique)
{
if(($blen*2+$alen) == ($len*2)) break;
si(($blen*2+$alen) == ($len*2+1))
{
si($ctype == 1)
{
$longueur -= $cstep ;
casser;
}autre{
casser;
}
}
}autre{
if($realnum == $len) break;
}
}
unset($cur);
non défini($alen);
unset($blen);
unset($numéro réel);
non défini($ctype);
unset($cstep);
return substr($titre,$début,$longueur);
}
Haha, je publierai également le code d'encodage UTF-8 plus tard.