O código a seguir é usado para codificação GB2312. Interceptar strings chinesas é uma dor de cabeça no PHP. A solução é determinar se é um caractere de byte duplo com base no valor maior ou igual a 128 para evitar caracteres ilegíveis. No entanto, sempre existem problemas como misturar chinês e inglês, símbolos especiais, etc. Agora escreverei um mais abrangente apenas para referência:
Descrição do programa:
1. O parâmetro len é baseado em caracteres chineses. 1len é igual a 2 caracteres ingleses para tornar o formulário mais bonito.
2. Se o parâmetro mágico for definido como falso, o chinês e o inglês serão tratados igualmente e o número absoluto de caracteres será considerado.
3. Especialmente adequado para strings codificadas com htmlspecialchars()
4. Pode manipular corretamente o
código do programa de modo de caractere de entidade (𖰰) em GB2312:
função FSubstr($título,$start,$len="",$magic=true)
{
/**
* alimentado por Smartpig
* mailto:[email protected]
*/
$comprimento = 0;
if($len == "") $len = strlen($title);
//Julga que a posição inicial está incorreta
if($início > 0)
{
$cnum = 0;
for($i=0;$i<$início;$i++)
{
if(ord(substr($título,$i,1)) >= 128) $cnum ++;
}
if($cnum%2 != 0) $start--;
não definido($cnum);
}
if(strlen($title)<=$len) return substr($title,$start,$len)
;
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($título,$i,1);
if($cur == "&")
{
if(substr($título,$i,4) == "<")
{
$cstep = 4;
$comprimento += 4;
$eu += 3;
$num real++;
if($mágica)
{
$alen++;
}
}
senão if(substr($título,$i,4) == ">")
{
$cstep = 4;
$comprimento += 4;
$eu += 3;
$num real++;
if($mágica)
{
$alen++;
}
}
senão if(substr($título,$i,5) == "&")
{
$cstep = 5;
$comprimento += 5;
$eu += 4;
$num real++;
if($mágica)
{
$alen++;
}
}
senão if(substr($título,$i,6) == """)
{
$cstep = 6;
$comprimento += 6;
$eu += 5;
$num real++;
if($mágica)
{
$alen++;
}
}
senão if(substr($título,$i,6) == "'")
{
$cstep = 6;
$comprimento += 6;
$eu += 5;
$num real++;
if($mágica)
{
$alen++;
}
}
senão if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$comprimento += strlen($correspondência[0]);
$i += strlen($correspondência[0])-1;
$num real++;
if($mágica)
{
$blen++;
$ctype = 1;
}
}
}outro{
if(ord($cur)>=128)
{
$cstep = 2;
$comprimento += 2;
$eu += 1;
$num real++;
if($mágica)
{
$blen++;
$ctype = 1;
}
}outro{
$cstep = 1;
$comprimento +=1;
$num real++;
if($mágica)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}outro{
$alen++;
}
}
}
}
if($mágica)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$comprimento -= $cstep;
quebrar;
}outro{
quebrar;
}
}
}outro{
if($num real == $len) break;
}
}
não definido($cur);
não definido($alen);
não definido($blen);
não definido($num real);
não definido($ctype);
unset($cstep);
return substr($título,$início,$comprimento);
}
Haha, também postarei o código de codificação UTF-8 mais tarde.