Lors du traitement des chaînes de mulabyte en PHP, la fonction couramment utilisée est MB_Strcut , qui peut intercepter les chaînes en fonction du nombre d'octets et convient au traitement du texte codé de plusieurs gobets tels que UTF-8. Cependant, de nombreux développeurs rencontrent souvent des erreurs de codage lors de l'utilisation de MB_Strcut pour intercepter les chaînes, ce qui entraîne des résultats d'interception ou de tronçant un demi-caractère. Cet article expliquera en détail comment utiliser correctement MB_strcut pour éviter les erreurs de codage et partager des conseils pratiques.
MB_strcut est l'une des fonctions de chaîne multipyte de PHP pour intercepter les chaînes par longueur d'octets. Contrairement à MB_substr , MB_Strcut est intercepté en fonction des octets, pas des caractères. Il peut contrôler plus précisément la longueur d'interception lorsqu'il s'agit de codage multi-octets, évitant les personnages brouillés tronqués.
Prototype de fonction:
mb_strcut(string $str, int $start, ?int $length = null, ?string $encoding = null): string
$ str : entrez une chaîne.
$ start : position de démarrage, calculé par nombre d'octets.
$ Longueur : le nombre d'octets interceptés (facultatif).
$ Encodage : codage de chaîne, le codage interne est utilisé par défaut.
Lorsque nous utilisons MB_Strcut pour intercepter la chaîne, si $ start ou $ longueur tombe de manière inappropriée au milieu du caractère multi-octets, le code brouillé apparaîtra car les octets de caractère tronquées sont incomplets. Surtout pour le codage UTF-8, un caractère chinois est généralement composé de 3 octets. Lors de l'interception des octets, il est nécessaire de s'assurer que le point de départ et le point final sont tous deux limites de caractère.
Lors de l'appel MB_Strcut , spécifier explicitement le codage de la chaîne est la première étape pour éviter les problèmes causés par le codage par défaut incohérent.
$encoding = 'UTF-8';
$result = mb_strcut($str, $start, $length, $encoding);
Avant d'intercepter, utilisez MB_STRLEN pour obtenir la longueur de caractères de la chaîne pour éviter $ démarrer et $ la longueur à partir de la gamme. Dans le même temps, combinez MB_SUBSTR pour vous assurer que la moitié d'un personnage n'est pas tronqué.
$length = 10;
if (mb_strlen($str, $encoding) > $length) {
$result = mb_substr($str, 0, $length, $encoding);
} else {
$result = $str;
}
Si vous devez intercepter par le nombre d'octets, calculez d'abord le nombre complet de caractères correspondant à la plage d'octet interceptée, puis utilisez MB_SUBSTR pour intercepter.
function safe_mb_strcut(string $str, int $start, int $length, string $encoding = 'UTF-8'): string {
$substr = mb_strcut($str, $start, $length, $encoding);
// mb_strcut Parfois, un demi-personnage peut être tronqué,Le transcodage confirme s'il est valable
if (mb_check_encoding($substr, $encoding)) {
return $substr;
}
// Si incomplet,Réduire la longueur,Jusqu'à terminer
while ($length > 0 && !mb_check_encoding($substr, $encoding)) {
$length--;
$substr = mb_strcut($str, $start, $length, $encoding);
}
return $substr;
}
$str = "Ceci est une chaîne de test,Comprend chinois etEnglish";
$start = 0;
$length = 15; // Intercepter par octets
$result = safe_mb_strcut($str, $start, $length, 'UTF-8');
echo $result;
Cela évite le problème brouillé causé par la troncature des octets.
MB_strcut intercepte les chaînes multi-octets par octets. Faites attention aux limites du caractère pour éviter de tronquer le demi-personnage.
Identifiez les paramètres d'encodage pour garantir que le comportement de la fonction est cohérent.
L'intégrité de l'encodage des résultats interceptés peut être vérifiée en combinaison avec MB_CHECK_ENCODING .
La combinaison de MB_Strlen et MB_Substr est plus sécurisée lorsque l'interception du caractère est nécessaire.
Grâce aux techniques ci-dessus, les erreurs de codage pendant l'interception de chaîne multi-octets en PHP peuvent être évitées efficacement, et la précision du traitement de texte et de l'expérience utilisateur peut être assurée.
<?php
function safe_mb_strcut(string $str, int $start, int $length, string $encoding = 'UTF-8'): string {
$substr = mb_strcut($str, $start, $length, $encoding);
if (mb_check_encoding($substr, $encoding)) {
return $substr;
}
while ($length > 0 && !mb_check_encoding($substr, $encoding)) {
$length--;
$substr = mb_strcut($str, $start, $length, $encoding);
}
return $substr;
}
$str = "Ceci est une chaîne de test,Comprend chinois etEnglish";
$start = 0;
$length = 15;
echo safe_mb_strcut($str, $start, $length, 'UTF-8');
?>
Si vous souhaitez en savoir plus sur le traitement des chaînes PHP, vous pouvez accéder aux ressources suivantes:
$url = "https://gitbox.net/php/manual/zh/function.mb-strcut.php";