Position actuelle: Accueil> Derniers articles> Erreurs communes dans la fonction MB_strcut lors du traitement des chaînes de base de données

Erreurs communes dans la fonction MB_strcut lors du traitement des chaînes de base de données

gitbox 2025-05-29

MB_STRCUT est une fonction très pratique lors de l'utilisation de PHP pour traiter les chaînes de plusieurs sitets. Il peut intercepter la longueur d'octets spécifiée d'une chaîne sans problèmes de code brouillé causés par des caractères multilinants tronqués comme le substr traditionnel. Cependant, lorsque nous exploitons des chaînes dans la base de données, en particulier en ce qui concerne le contenu multilingue et la conversion de codage, l'utilisation de MB_strcut est également sujette à certaines erreurs. Cet article analysera ces erreurs courantes et leur évitement en détail.


1. Introduction à MB_strcut

MB_strcut est de couper le nombre spécifié d'octets de la chaîne, pas le nombre de caractères. Il est conçu pour le codage multi-octets, évitant le code brouillé causé par le tronçon d'un caractère multi-octets.

Le prototype de fonction est le suivant:

 mb_strcut(string $string, int $start, int $length = null, string $encoding = null): string
  • $ String : entrez une chaîne.

  • $ start : la position de départ de l'octet.

  • $ Longueur : la longueur d'octets interceptée (facultatif).

  • $ Encodage : codage des caractères, la valeur par défaut est le codage interne.


2. Erreurs et causes courantes

1. Résultats du codage incohérent dans une erreur de troncature

Le codage de chaîne stocké dans la base de données est incompatible avec le codage utilisé par MB_strcut , ce qui entraînera des résultats d'interception anormaux. Par exemple, le champ de base de données est un codage UTF-8, mais le programme utilise le codage interne par défaut (probablement ISO-8859-1), ce qui entraînera des erreurs de position de troncature d'octets.

Manifestations d'erreur:
Le résultat d'interception est brouillé, les personnages sont incomplets et même le programme lance une exception.

Comment l'éviter:

  • Identifier $ Encoding , par exemple:

 mb_strcut($string, 0, 10, 'UTF-8');
  • Assurez-vous que le codage des connexions de la base de données et des résultats de requête est conforme au codage du programme. MySQL peut être exécuté par:

 SET NAMES 'utf8mb4';

Ou spécifiez lorsque la connexion APDI:

 new PDO('mysql:host=...;dbname=...', $user, $pass, [
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
]);

2. Erreur dans le calcul de la position d'octet de démarrage

Le paramètre $ start de MB_strcut est la position d'octet, pas la position de caractère. Si les développeurs sont utilisés pour passer des positions de caractère comme des positions d'octets, cela conduira à l'interception de l'écart de position.

Manifestations d'erreur:
La chaîne interceptée commence des attentes, ce qui peut entraîner des caractères manquants ou un code brouillé.

Comment l'éviter:

  • Lorsque vous utilisez MB_STRPOS pour obtenir la position d'octet, veuillez spécifier le même codage.

  • Si vous souhaitez utiliser des positions de caractère, vous devez d'abord convertir la position de caractère en position d'octets.

Exemple:

 $pos_char = 3; // 1 et 13Personnages
$pos_byte = strlen(mb_substr($string, 0, $pos_char, 'UTF-8'));
$result = mb_strcut($string, $pos_byte, 10, 'UTF-8');

3. Longueur d'interception incorrecte provoque une troncature du caractère

$ la longueur est la longueur d'octets. Si la longueur interceptée est au milieu des caractères multi-octets, MB_Strcut tronquera en toute sécurité à la frontière complète des caractères, mais si l'erreur logique entraîne la définition de mal, elle peut affecter l'effet d'interception.

Comment l'éviter:

  • Calculez la longueur des octets raisonnablement en fonction des exigences.

  • Si vous souhaitez intercepter un nombre fixe de caractères, vous pouvez l'utiliser en combinaison avec MB_substr .


3. Exemples pratiques

En supposant qu'une chaîne chinoise est stockée dans la base de données, nous voulons intercepter les 10 premiers octets.

 <?php
// Obtenez des chaînes de la base de données
$string = "Bonjour,Accueillirmb_strcutfonction!";

// Spécifiez le codage
$encoding = 'UTF-8';

// Avant d&#39;intercepter10Octets
$result = mb_strcut($string, 0, 10, $encoding);

echo $result;
?>

Dans cet exemple, MB_strcut garantira que la moitié du caractère chinois ne sera pas tronqué et que la chaîne de sortie ne sera pas brouillée.


4. Résumé

  • Lorsque vous utilisez MB_Strcut , assurez-vous de le coder clairement et d'être cohérent avec le codage de la base de données.

  • Notez que $ start et $ la longueur sont tous deux des unités d'octets, pas des unités de caractère, ils doivent donc être calculés soigneusement.

  • Coordonnez avec les paramètres du jeu de caractères de la base de données pour éviter les erreurs causées par le codage de l'inadéquation.

  • Pour l'interception des caractères, il est recommandé d'utiliser MB_substr . MB_strcut convient plus aux scénarios où l'interception des octets est interceptée.

La maîtrise des compétences ci-dessus peut efficacement éviter les erreurs courantes dans le traitement des chaînes de bases de données par MB_Strcut et s'assurer que le programme sort des chaînes multi-octets correctes et sûres.


 <?php
// Exemple:Secure Intercept Multibyte Crises dans la base de données

// Supposons que la base de données est connectée,Et le jeu de caractères estutf8mb4

// Lire les chaînes de la base de données
$query = "SELECT content FROM articles WHERE id = 1";
$result = $pdo->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);

$content = $row['content'];
$encoding = 'UTF-8';

// Avant d&#39;intercepter50Octets,Évitez le code brouillé
$snippet = mb_strcut($content, 0, 50, $encoding);

echo $snippet;
?>

Si vous souhaitez en savoir plus sur le traitement des chaînes multi -yte, vous pouvez visiter:
https://gitbox.net/php/manual/zh/fonction.mb-strcut.php