Position actuelle: Accueil> Derniers articles> Problèmes communs lorsque la fonction MB_Strcut gère les caractères spéciaux

Problèmes communs lorsque la fonction MB_Strcut gère les caractères spéciaux

gitbox 2025-05-26

Qu'est-ce que MB_strcut?

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&#39;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.


Y aura-t-il une erreur lors de la rencontre des caractères spéciaux?

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.

1. Il peut y avoir des problèmes de troncature

É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é.

2. Prend en charge des personnages de 4 octets tels que les emoji

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.


Résumé de la FAQ

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

Exemple de solution

Utilisez MB_substr pour éviter le code brouillé

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 ??”
?>

Utilisez MB_Strcut pour déterminer la limite

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.


Conclusion

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.