Dans le développement de PHP, le traitement des chaînes de mulabyte est un lien commun et sujet aux erreurs. Surtout quand il s'agit d'intercepter les chaînes, la fonction MB_Strcut est souvent utilisée à la place du substr pour éviter les problèmes brouillés lors de l'interception des caractères multilingue. Cependant, de nombreux développeurs ont des doutes sur la différence entre les octets et les caractères dans MB_Strcut . Cet article analysera les différences entre les deux en détail pour vous aider à mieux comprendre et utiliser la fonction.
MB_STRCUT est une fonction dans la bibliothèque de fonctions de chaîne MultiByte PHP MBSTRING , qui est utilisée pour intercepter une partie d'une chaîne.
string mb_strcut ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
$ str : Entrez la chaîne
$ start : la position de départ, l'unité est l'octet (octet)
$ Longueur : intercepte la longueur, l'unité est également des octets (facultatif)
$ Encodage : codage de chaîne, encodage par défaut interne
Byte : l'unité de base du stockage de données dans un ordinateur, 1 octet = 8 bits. Un octet peut représenter un personnage anglais, mais pour les caractères chinois ou d'autres caractères multi-octets, plusieurs octets sont souvent nécessaires.
Caractère : fait référence à un "symbole" complet, quel que soit le nombre d'octets qu'il occupe.
Par exemple, dans le codage UTF-8, un caractère chinois représente généralement 3 octets, tandis qu'un caractère anglais représente 1 octet.
Le point clé de MB_Strcut est que ses paramètres $ start et $ longueur sont tous deux en octets, qui sont différents des autres fonctions (comme MB_SUBSTR ), qui sont en caractères.
Cela signifie que si vous souhaitez intercepter 5 caractères à partir du troisième caractère, l'utilisation de MB_strcut nécessite de calculer le nombre d'octets occupés par chaque caractère. L'utilisation d'indexation directement conduira directement à des erreurs d'interception, et même à l'interception de la moitié d'un caractère multi-octets, provoquant un code brouillé.
L'avantage de MB_strcut est qu'il garantit que la partie médiane du caractère multi-octets n'est pas tronquée. Lors de l'interception, MB_Strcut ajustera automatiquement la limite pour éviter de tronquer la partie des caractères et empêcher la sortie du code brouillé.
Par exemple:
<?php
$str = "Bonjour,world!"; // "Bonjour"Deux caractères chinois,Les marques d'anglais et d'exclamation sont suivies
echo mb_strcut($str, 0, 6, "UTF-8");
?>
Dans le code ci-dessus, la longueur de 6 octets est exactement le nombre d'octets des deux caractères chinois "vous" et "bon" (3 octets par caractère chinois). MB_strcut interceptera correctement ces deux caractères chinois sans couper la moitié du personnage.
Si vous utilisez la fonction substr ou intercepte en caractères, les octets peuvent être tronqués pour provoquer un code brouillé.
Après avoir compris les unités d'octets de MB_Strcut , nous pouvons utiliser MB_STRLEN et MB_SUBSTR pour aider à calculer le nombre d'octets. Par exemple:
<?php
$str = "Bonjour,world!";
$encoding = "UTF-8";
for ($i = 0; $i < mb_strlen($str, $encoding); $i++) {
$char = mb_substr($str, $i, 1, $encoding);
$byteLen = strlen(mb_convert_encoding($char, "UTF-8", $encoding));
echo "personnage {$char} Nombre d'octets occupés: {$byteLen}\n";
}
?>
Sortir:
personnage toi Nombre d'octets occupés: 3
personnage bien Nombre d'octets occupés: 3
personnage , Nombre d'octets occupés: 3
personnage w Nombre d'octets occupés: 1
personnage o Nombre d'octets occupés: 1
personnage r Nombre d'octets occupés: 1
personnage l Nombre d'octets occupés: 1
personnage d Nombre d'octets occupés: 1
personnage ! Nombre d'octets occupés: 3
Cela indique que le caractère multi-gyte occupe plusieurs octets dans UTF-8.
Si vous souhaitez tronquer les chaînes en fonction de la longueur des octets et empêchez les caractères multi-octets d'être tronqués au milieu, vous devez utiliser MB_strcut .
Si vous souhaitez intercepter une chaîne en fonction du nombre de caractères (quel que soit le nombre d'octets que chaque personnage prend), vous devez utiliser MB_substr .
Assurez-vous de spécifier le codage correct, sinon le calcul des octets peut être des erreurs.
Dans la transmission du réseau, le stockage de la base de données ou les opérations de fichiers, la longueur d'octets des chaînes est souvent plus importante que la longueur du caractère, et MB_Strcut est très pratique pour le moment.
Si vous n'êtes pas familier avec la différence entre les octets et les caractères, vous êtes sujet aux exceptions de troncature et aux problèmes de code brouillé.
<?php
// Exemple de code:utilisermb_strcutIntercepterUTF-8编码personnage串的前6Octets(对应Deux caractères chinois)
$str = "Bonjour,world!";
$cutStr = mb_strcut($str, 0, 6, "UTF-8");
echo $cutStr; // Sortir "Bonjour"
?>