Position actuelle: Accueil> Derniers articles> Comment utiliser MB_strcut pour traiter les chaînes contenant des caractères emoji

Comment utiliser MB_strcut pour traiter les chaînes contenant des caractères emoji

gitbox 2025-05-26

MB_STRCUT est une fonction très pratique en PHP lorsqu'il s'agit de chaînes multiples. Sa fonction principale est d'intercepter les sous-chaînes par des octets à partir d'une chaîne multi -yte. Cependant, lorsqu'une chaîne contient des caractères spéciaux tels que les emoji, l'utilisation de MB_strcut nécessite des soins supplémentaires.

Comment fonctionne MB_Strcut

MB_STRCUT (String $ String, int $ start ,? int $ longueur = null ,? String $ Encoding = null): String
Cette fonction intercepte les chaînes basées sur les décalages d'octets (plutôt que sur les décalages de caractère).

Contrairement à MB_substr , MB_Strcut est en fait une version "octet-safe", mais lorsqu'elle rencontre des caractères multi-gytets (comme les emoji) coupés, il tronque directement plutôt que les caractères complets.

Jetons un coup d'œil à un exemple:

<code> $ str = "Hello ?? world!"; $ Cut = MB_strcut ($ str, 0, 9, 'utf-8'); Echo $ Cut; </code>

Vous pouvez vous attendre à ce que la sortie soit bonjour ?? , mais vous pouvez en fait voir une corde cassée, même brouillée. C'est parce que ?? Sous UTF-8, le codage est un caractère de 4 octets, et MB_strcut peut être tronqué dans les octets moyens.

Pourquoi les emoji sont-ils particulièrement gênants?

Les emoji sont généralement 4 octets ou même plus (par exemple, des emoji composés, comme ??????????). Si vous ne coupez que par des octets sans considérer les limites de caractère, vous pouvez apparaître:

  • La sortie contient des caractères illégaux;

  • Le navigateur s'affiche sous forme de codes brouillés ou de marques d'interrogation;

  • La base de données peut signaler une erreur (en particulier en mode strict);

  • Le codage JSON peut échouer.

Comment intercepter gracieusement les chaînes contenant des emoji?

Si votre objectif est d'afficher un aperçu de texte avec des emoji (comme un résumé de contenu tel que Weibo, des commentaires, etc.), vous pouvez considérer les méthodes suivantes:

Méthode 1: Utilisez MB_substr au lieu de MB_Strcut

Si cela ne vous dérange pas d'intercepter dans des "caractères", vous pouvez utiliser MB_substr , qui garantit que les limites des caractères ne sont pas brisées:

<code> $ str = "Hello ?? world!"; $ aperview = mb_substr ($ str, 0, 7, 'utf-8'); Echo $ aperçu; </code>

Cela produit les caractères complets, pas les octets cassés.

Méthode 2: combinaison régulière des caractères illégaux

Si vous insistez sur l'utilisation de MB_Strcut (par exemple, pour contrôler le nombre d'octets), vous pouvez utiliser une suppression régulière de caractères incomplets après troncature:

<code> $ str = "Hello ?? world!"; $ Cut = MB_strcut ($ str, 0, 9, 'utf-8');

// utilise un nettoyage régulier de caractères illégaux
$ Clean = preg_replace ('/ [\ xc0- \ xff] [\ x80- \ xbf] * $ /', '', $ Cut);
Echo $ Clean;
</code>

Ce code tente de supprimer des caractères multi -yte incomplets qui peuvent être tronqués à la fin.

Méthode 3: Utilisez IntlBreakiterator pour déterminer la limite (méthode recommandée)

L'extension INTL de PHP fournit une détection des limites des caractères, adaptée à la gestion des caractères multipyte complexes:

<code> $ str = "Hello ?? world!"; $ breakiterator = intlbreakiterator :: createCharAtteRinstance ('en'); $ breakiterator-> setText ($ str);

$ octes = 0;
$ limit = 9;
$ pos = 0;

foreach ($ breakiterator comme $ limite) {
$ chunk = mb_substr ($ str, $ pos, $ limite - $ pos, 'utf-8');
$ chunkbytes = strlen ($ chunk);
if ($ bytes + $ chunkbytes> $ limit) {
casser;
}
$ octes + = $ chunkbytes;
$ pos = $ limite;
}

$ aperview = mb_substr ($ str, 0, $ pos, 'utf-8');
Echo $ aperçu;
</code>

Cela garantit que la chaîne que vous interceptez est toujours pleine de caractères sous les limites des octets et convient aux projets d'internationalisation ou à un traitement de texte complexe.

Résumer

Lorsque les chaînes contiennent des emoji ou d'autres caractères multi -yte, une attention particulière est nécessaire pour intercepter les chaînes à l'aide de MB_Strcut :

  • Il est intercepté par des octets, qui peuvent détruire les emoji;

  • Après troncature, les caractères illégaux doivent être nettoyés ou combinés avec une réparation régulière;

  • L'utilisation de MB_substr est plus sûre, mais ne contrôle pas les octets avec précision;

  • Il est recommandé d'utiliser Intlbreakiterator pour s'assurer que la position de troncature est légale.

Assurez-vous de tester l'intégrité et la compatibilité du traitement des emoji dans l'interface utilisateur, le stockage de la base de données, la sortie de l'interface, etc. pour éviter les problèmes de code brouillé ou d'exceptions de données.

Pour plus de meilleures pratiques sur le traitement des caractères, veuillez vous référer à la documentation ou visiter https://gitbox.net/dev/mbstring .