Maison >développement back-end >tutoriel php >PHP coupe les caractères chinois sans caractères tronqués

PHP coupe les caractères chinois sans caractères tronqués

王林
王林original
2019-09-17 13:03:413888parcourir

PHP coupe les caractères chinois sans caractères tronqués

En PHP, si la fonction substr() intercepte une chaîne chinoise, des caractères tronqués peuvent apparaître car le nombre d'octets occupés par un octet dans les caractères chinois et occidentaux est différent. Le paramètre de longueur de substr est calculé en octets. Dans le codage GB2312, un caractère chinois occupe 2 octets et l'anglais occupe 1 octet. Dans le codage UTF-8, un caractère chinois peut occuper 2 ou 3 octets, en anglais ou en demi-chasse. occupe 1 octet.

L'utilisation directe de la fonction PHP substr pour intercepter les caractères chinois peut provoquer des caractères tronqués. La raison principale est que substr peut forcer "scier" un caractère chinois en deux. Solution :

1. Utilisez l'interception mb_substr de la bibliothèque d'extension mbstring pour éviter les caractères tronqués.

2. Écrivez vous-même la fonction d'interception, mais l'efficacité n'est pas aussi élevée que l'utilisation de la bibliothèque d'extension mbstring.

3. S'il s'agit simplement de sortir la chaîne interceptée, elle peut être implémentée de la manière suivante : substr($str, 0, 30).chr(0). La fonction

substr() peut diviser le texte, mais si le texte à diviser comprend des caractères chinois, vous rencontrerez souvent des problèmes. Dans ce cas, vous pouvez utiliser la fonction mb_substr()/mb_strcut. function, mb_substr()/ L'utilisation de mb_strcut est similaire à substr(), sauf qu'un paramètre supplémentaire doit être ajouté à la fin de mb_substr()/mb_strcut pour définir l'encodage de la chaîne. Cependant, la plupart des serveurs ne s'ouvrent pas. php_mbstring.dll, vous devez donc ajouter php_mbstring dans php.ini .dll s'ouvre.

Par exemple :

<?php
echo mb_substr(&#39;这样一来我的字符串就不会有乱码^_^&#39;, 0, 7, &#39;utf-8&#39;);
?>
输出:这样一来我的字
<?php
echo mb_strcut(&#39;这样一来我的字符串就不会有乱码^_^&#39;, 0, 7, &#39;utf-8&#39;);
?>

Sortie : comme ceci

Comme le montre l'exemple ci-dessus, mb_substr divise les caractères par mots, tandis que mb_strcut divise les caractères par octets. Pour segmenter les caractères , mais cela ne produira pas la moitié d'un caractère.

Comment intercepter des chaînes chinoises sans caractères tronqués en utilisant PHP

function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
  $str=null;
  $len=$start+$length;
  for($i=$start;$i<$len;$i++){
  if(ord(substr($string,$i,1))>0xa0){
   $str.=substr($string,$i,2);
   $i++;
  }else{
   $str.=substr($string,$i,1);
  }
  }
  return $str.&#39;...&#39;;
}else{
  return $string;
}
}

Comment intercepter des chaînes chinoises sans caractères tronqués - adapté à utf- 8

function substr_text($str, $start=0, $length, $charset="utf-8", $suffix="")
{
if(function_exists("mb_substr")){
return mb_substr($str, $start, $length, $charset).$suffix;
}
elseif(function_exists(&#39;iconv_substr&#39;)){
return iconv_substr($str,$start,$length,$charset).$suffix;
}
$re[&#39;utf-8&#39;] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re[&#39;gb2312&#39;] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re[&#39;gbk&#39;]  = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re[&#39;big5&#39;]  = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("",array_slice($match[0], $start, $length));
return $slice.$suffix;
}

Tutoriel recommandé : Tutoriel vidéo PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn