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.
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.
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"
]);
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');
$ 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 .
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'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.
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'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