Maison > Article > développement back-end > 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('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8'); ?> 输出:这样一来我的字 <?php echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8'); ?>
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.'...'; }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('iconv_substr')){ return iconv_substr($str,$start,$length,$charset).$suffix; } $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; $re['big5'] = "/[\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!