Procedimiento 1: método PHP para interceptar cadenas chinas
Dado que a menudo aparecen caracteres confusos (usando substr) al interceptar cadenas chinas en la página de inicio del sitio web y en vTigerCRM, hoy encontré un método mejor para interceptar cadenas chinas y me gustaría compartirlo con ustedes. .
función msubstr($cadena, $inicio, $len) {
$tmpstr = "";
$cadena = $inicio + $len;
for($i = 0; $i < $stren; $i++) {
if(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($cadena, $i, 2);
$yo++;
} demás
$tmpstr .= substr($cadena, $i, 1);
}
devolver $tmpstr;
}
Programa 2: PHP intercepta la cadena UTF-8 y resuelve el problema de medio carácter
/********************************* *************************************
* PHP intercepta cadenas UTF-8 para resolver el problema de medio carácter.
* El inglés y los números (ancho medio) son de 1 byte (8 bits), el chino (ancho completo) es de 3 bytes
* @return La cadena extraída, cuando $len es menor o igual a 0, se devolverá la cadena completa
* @param $str cadena fuente
* $len es la longitud de la subcadena de la izquierda
************************************************** * *******************/
función utf_substr($cadena,$len)
{
para($i=0;$i<$len;$i++)
{
$temp_str=substr($cadena,0,1);
si(ord($temp_str) > 127)
{
$yo++;
si($i<$len)
{
$new_str[]=substr($str,0,3);
$cadena=subcadena($cadena,3);
}
}
demás
{
$new_str[]=substr($str,0,1);
$cadena=subcadena($cadena,1);
}
}
volver a unirse($new_str);
}
?>
Intercepción de cadenas php utf-8
<?
función cutstr($cadena, $longitud) {
preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef ][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80 -xbf][x80-xbf][x80-xbf]/", $cadena, $info);
para($i=0; $i<count($info[0]); $i++) {
$wordscut .= $info[0][$i];
$j = orden($info[0][$i]) > 127 ? $j + 2 : $j + 1;
si ($j > $longitud - 3) {
devolver $corte de palabras." ...";
}
}
return join('', $info[0]);
}
$string="242432 La oposición está 456 comprometida en el amplio local de la embajada 7890";
para($i=0;$i<strlen($cadena);$i++)
{
echo cutstr($cadena,$i)."<br>";
}
?>
Función de interceptación de cadenas UTF-8
Para admitir varios idiomas, la cadena en la base de datos se puede guardar como codificación UTF-8. En el desarrollo de sitios web, es posible que necesite utilizar PHP para interceptar parte de la cadena. Para evitar caracteres confusos, escriba la siguiente función de interceptación de cadenas UTF-8.
Para conocer el principio de UTF-8, consulte las preguntas frecuentes sobre UTF-8.
Los caracteres codificados en UTF-8 pueden constar de 1 a 3 bytes. determinado por el primero juzgado por bytes. (En teoría podría ser más largo, pero aquí asumimos que no supera los 3 bytes)
Si el primer byte es mayor que 224, este y los 2 bytes posteriores forman un carácter UTF-8. Si el primer byte es mayor que 192 y menor que 224, él y el 1 byte posterior forman un carácter UTF-8. Carácter De lo contrario, el primer byte en sí es un carácter inglés (incluidos números y una pequeña cantidad de puntuación).
Código diseñado previamente para un sitio web (también la función de interceptación de longitud que se utiliza actualmente en la página de inicio)
Código:
<?php // Cortar_Str;
//$sourcestr es la cadena a procesar
//$cutlength es la longitud de la intercepción (es decir, el número de palabras)
función cut_str($fuentestr,$longituddecorte)
{
$returnstr='';
$yo=0;
$n=0;
$str_length=strlen($sourcestr);//El número de bytes en la cadena
mientras (($n<$cutlength) y ($i<=$str_length))
{
$temp_str=substr($fuentestr,$i,1);
$ascnum=Ord($temp_str);//Obtener el código ascii del $i-ésimo carácter en la cadena
if ($ascnum>=224) //Si el bit ASCII es alto y 224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //Según la especificación de codificación UTF-8, 3 caracteres consecutivos se cuentan como un solo carácter.
$i=$i+3; //El byte real se cuenta como 3
$n++; //La longitud de la cadena cuenta como 1
}
elseif ($ascnum>=192) //Si el bit ASCII es alto y 192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //De acuerdo con la especificación de codificación UTF-8, 2 caracteres consecutivos se cuentan como un solo carácter.
$i=$i+2; //El byte real se cuenta como 2
$n++; //La longitud de la cadena cuenta como 1
}
elseif ($ascnum>=65 && $ascnum<=90) //Si es una letra mayúscula,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //El número real de Bytes todavía cuenta como 1
$n++; //Pero considerando la apariencia general, las letras mayúsculas se cuentan como un carácter de bits altos.
}
else //En otros casos, incluya letras minúsculas y signos de puntuación de medio ancho,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //El recuento de bytes real es 1
$n=$n+0.5; //Las letras minúsculas y los signos de puntuación de ancho medio tienen la mitad del ancho de los caracteres de orden superior...
}
}
si ($str_length>$cutlength){
$returnstr = $returnstr "...";//Agregue puntos suspensivos al final cuando la longitud exceda.
}
return $returnstr
}
Interceptar función de cadena utf-8
FSubstr($title,$start,$len="",$magic=true)
{
/**
* impulsado por Smartpig
* correo a:[email protected]
*/
if($len == "") $len=strlen($título);
si ($ inicio! = 0)
{
$iniciov = ord(substr($título,$inicio,1));
si($iniciov >= 128)
{
si($iniciov < 192)
{
para($i=$inicio-1;$i>0;$i--)
{
$tempv = ord(substr($título,$i,1));
if($tempv >= 192) descanso;
}
$inicio = $i;
}
}
}
if(strlen($título)<=$len) return substr($título,$inicio,$len);
$alén = 0;
$blen = 0;
$número real = 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)
{
$alén++;
}
}
else if(substr($título,$i,4) == ">")
{
$cpaso = 4;
$longitud += 4;
$yo += 3;
$númeroreal++;
si($magia)
{
$alén++;
}
}
else if(substr($título,$i,5) == "&")
{
$cpaso = 5;
$longitud += 5;
$yo += 4;
$númeroreal++;
si($magia)
{
$alén++;
}
}
else if(substr($título,$i,6) == """)
{
$cpaso = 6;
$longitud += 6;
$yo += 5;
$númeroreal++;
si($magia)
{
$alén++;
}
}
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)>=252)
{
$cpaso = 6;
$longitud += 6;
$yo += 5;
$númeroreal++;
si($magia)
{
$blen++;
$ctipo = 1;
}
}elseif(ord($cur)>=248){
$cpaso = 5;
$longitud += 5;
$yo += 4;
$númeroreal++;
si($magia)
{
$ctipo = 1;
$blen++;
}
}elseif(ord($cur)>=240){
$cpaso = 4;
$longitud += 4;
$yo += 3;
$númeroreal++;
si($magia)
{
$blen++;
$ctipo = 1;
}
}elseif(ord($cur)>=224){
$cpaso = 3;
$longitud += 3;
$yo += 2;
$númeroreal++;
si($magia)
{
$ctipo = 1;
$blen++;
}
}elseif(ord($cur)>=192){
$cpaso = 2;
$longitud += 2;
$yo += 1;
$númeroreal++;
si($magia)
{
$blen++;
$ctipo = 1;
}
}elseif(ord($cur)>=128){
$longitud += 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;
}
}
desarmado($cur);
desarmado($alen);
desarmado($blen);
sin establecer ($ número real);
desarmado($ctipo);
desarmado($cstep);
return substr($título,$inicio,$longitud);
}