La fonction de la fonction MB_Strcut est d'intercepter les fragments de chaîne de la longueur d'octet spécifiée à partir d'une chaîne multi -yte. Il est similaire à MB_substr , mais la différence est que MB_Strcut est intercepté en unités d'octets, pas des caractères.
<?php
$str = "Ceci est une chaîne de test";
echo mb_strcut($str, 0, 6, "UTF-8"); // Sortir“C'est un”
?>
Ici 6 est le nombre d'octets (encodage UTF-8, un caractère chinois représente généralement 3 octets), de sorte que les deux premiers caractères chinois sont en fait interceptés.
Les caractères spéciaux peuvent se référer aux emojis, à des symboles spéciaux, à des caractères combinés (tels que des lettres avec des notes diacritiques), etc. Ces caractères ont tendance à occuper plus de 3 octets dans UTF-8, et peuvent même prendre 4 octets ou plus.
Étant donné que MB_Strcut est intercepté sur la base du nombre d'octets, si la longueur d'interception est juste tronquée par une partie d'un caractère multi-octets, cela provoquera des caractères brouillés ou incomplets dans la chaîne tronquée.
Exemple:
<?php
$str = "Hello ?? World";
echo mb_strcut($str, 0, 8, "UTF-8"); // 可能Sortir“Hello ”Talon brouillé
?>
Voici un emoji qui occupe 4 octets. Si la longueur interceptée tombe au milieu des octets des emoji, les caractères seront coupés, entraînant un code brouillé.
Depuis PHP MB_Strcut , l'extension MBSTring prend mieux les caractères de 4 octets, mais doit toujours faire attention à l'interception de la longueur et des limites des caractères.
question | illustrer | Solution |
---|---|---|
La troncature du caractère provoque du code brouillé | Coupez les caractères multi-octets dans la même longueur, ce qui entraîne une chaîne incomplète | Utilisez à la place MB_substr , interceptez par caractère |
Exception de gestion des personnages de 4 octets | Les emoji de 4 octets sont incomplets lorsqu'ils sont interceptés | Améliorez la version PHP et utilisez MBSTRING qui prend en charge 4 octets |
Octet et confusion de longueur de caractère | MB_strcut est intercepté par des octets, MB_SUBSTR est intercepté par des caractères, il est facile de faire des erreurs lorsqu'il est mélangé. | Clarifier les exigences et sélectionner les fonctions correspondantes |
L'encodage des personnages est incohérent | Le codage entrant ne correspond pas au codage réel de la chaîne, ce qui entraîne une exception d'interception | Confirmez le codage des cordes et passez-le correctement |
MB_SUBSTR est intercepté par des caractères et ne tronquera pas le moitié d'un caractère multi-octet, évitant le code brouillé.
<?php
$str = "Hello ?? World";
echo mb_substr($str, 0, 7, "UTF-8"); // Sortir“Hello ??”
?>
Si vous devez utiliser MB_Strcut , il est recommandé de détecter manuellement si le point intercepté est une limite de caractère complète, ou d'utiliser MB_Strlen pour obtenir le nombre de caractères, puis calculer le nombre correspondant d'octets.
MB_STRCUT est un outil puissant lorsqu'il s'agit de cordes à plusieurs octets, mais parce qu'elle intercepte par des octets, il peut produire des exceptions brouillées ou tronquées lors de la rencontre de caractères spéciaux (en particulier des emoji de 4 octets). Comprendre la différence entre les octets et les caractères, le choix de MB_Strcut ou MB_Substr raisonnablement, et s'assurer que le codage des caractères est cohérent est la clé pour éviter les problèmes.