El siguiente código se utiliza para la codificación GB2312. Interceptar cadenas chinas es un dolor de cabeza en PHP. La solución es determinar si es un carácter de doble byte en función de si el valor es mayor o igual a 128 para evitar caracteres confusos. Sin embargo, siempre existen problemas como mezclar chino e inglés, símbolos especiales, etc. Ahora escribiré uno más completo solo como referencia:
Descripción del programa:
1. El parámetro len se basa en caracteres chinos. 1len es igual a 2 caracteres ingleses para que el formulario sea más hermoso.
2. Si el parámetro mágico se establece en falso, el chino y el inglés se tratarán por igual y se tomará el número absoluto de caracteres.
3. Especialmente adecuado para cadenas codificadas con htmlspecialchars()
4. Puede manejar correctamente el
código del programa del modo de carácter de entidad (𖰰) en GB2312:
función FSubstr($título,$inicio,$len="",$magic=true)
{
/**
* impulsado por Smartpig
* correo a:[email protected]
*/
$longitud = 0;
if($len == "") $len = strlen($title);
//Juzga que la posición inicial es incorrecta
si($inicio > 0)
{
$cnúm = 0;
para($i=0;$i<$inicio;$i++)
{
if(ord(substr($título,$i,1)) >= 128) $cnum ++;
}
if($cnum%2!= 0) $inicio--;
desarmado($cnum);
}
if(strlen($título)<=$len) return substr($título,$inicio,$len
= 0
);
$blen = 0;
$numeroreal = 0;
para($i=$inicio;$i<strlen($título);$i++)
{
$ctipo = 0;
$cpaso = 0;
$cur = substr($título,$i,1);
si($cur == "&")
{
if(substr($título,$i,4) == "<")
{
$cpaso = 4;
$longitud += 4;
$yo += 3;
$númeroreal++;
si($magia)
{
$alen++;
}
}
else if(substr($título,$i,4) == ">")
{
$cpaso = 4;
$longitud += 4;
$yo += 3;
$númeroreal++;
si($magia)
{
$alen++;
}
}
else if(substr($título,$i,5) == "&")
{
$cpaso = 5;
$longitud += 5;
$yo += 4;
$númeroreal++;
si($magia)
{
$alen++;
}
}
else if(substr($título,$i,6) == """)
{
$cpaso = 6;
$longitud += 6;
$yo += 5;
$númeroreal++;
si($magia)
{
$alen++;
}
}
else if(substr($título,$i,6) == "'")
{
$cpaso = 6;
$longitud += 6;
$yo += 5;
$númeroreal++;
si($magia)
{
$alen++;
}
}
else if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($partido[0]);
$longitud += strlen($partido[0]);
$i += strlen($partido[0])-1;
$númeroreal++;
si($magia)
{
$blen++;
$ctipo = 1;
}
}
}demás{
si(ord($cur)>=128)
{
$cpaso = 2;
$longitud += 2;
$yo += 1;
$númeroreal++;
si($magia)
{
$blen++;
$ctipo = 1;
}
}demás{
$cpaso = 1;
$longitud +=1;
$númeroreal++;
si($magia)
{
si(orden($cur) >= 65 && orden($cur) <= 90)
{
$blen++;
}demás{
$alén++;
}
}
}
}
si($magia)
{
if(($blen*2+$alen) == ($len*2)) descanso;
si(($blen*2+$alen) == ($len*2+1))
{
si($ctipo == 1)
{
$longitud -= $cpaso;
romper;
}demás{
romper;
}
}
}demás{
if($realnum == $len) descanso;
}
}
unset($cur);
desarmado($alen);
desarmado($blen);
sin establecer ($ número real);
desarmado($ctipo);
unset($cstep);
return substr($título,$inicio,$longitud);
}
Jaja, también publicaré el código de codificación UTF-8 más adelante.