Tout d'abord, nous devons comprendre les différences entre les jeux de caractères à un octet et les jeux de caractères multi-octets. Un jeu de caractères à un octet fait référence à un jeu de caractères qui occupe un espace d'octet pour chaque caractère, comme ASCII. Chaque caractère peut être représenté dans une plage entière de 0 à 255.
En revanche, les jeux de caractères multi-octets (tels que UTF-8, GB2312, Shift-Jis, etc.) utilisent plusieurs octets pour représenter un caractère. Pour des langues comme le chinois et le japonais, un personnage peut prendre 2, 3 ou même 4 octets.
Dans un jeu de caractères à un octet, Strtoupper () fonctionne en douceur car la taille de chaque caractère est cohérente et il n'y a pas besoin de traitement spécial. Cependant, dans le cas des jeux de caractères mulabyte, cette fonction peut avoir des problèmes.
La fonction strtoupper () est basée sur un jeu de caractères à un octet par défaut, qui vérifie l'octet de caractères et convertit les lettres en majuscules. Dans une chaîne de jeux de caractères mulabyte, les caractères peuvent s'étendre sur plusieurs octets, ce qui fait que Strtoupper () ne reconnaît pas correctement le caractère entier et le convertir.
Prenant un encodage UTF-8 comme exemple, les caractères de l'UTF-8 ne correspondent pas aux octets un par un comme les caractères ASCII. Lorsque nous essayons d'appliquer Strtoupper () à une chaîne contenant des caractères multi -yte, il peut gérer une partie d'un caractère multi-gyte en tant que lettre normale, entraînant des erreurs ou des conversions incomplètes.
Par exemple:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"Bonjour,world!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>); </span><span><span class="hljs-comment">// Sortir: Bonjour,WORLD!</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans le code ci-dessus, Strtoupper () est capable de convertir correctement le "monde" en "monde". Cependant, comme le caractère chinois "Hello" est un jeu de personnages multi -yte, il n'a rien changé.
PHP fournit plusieurs méthodes pour résoudre ce problème, le moyen le plus courant est d'utiliser la fonction MB_Strtoupper () . Cette fonction fait partie de l'extension MBSTRING , conçue pour les jeux de caractères multi-gobets et est capable de gérer correctement divers caractères multi -yte, y compris le chinois.
MB_strtoupper () convertit correctement les caractères des jeux de caractères multi -yte en majuscules. L'utilisation de base de cette fonction est la suivante:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"Bonjour,world!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>); </span><span><span class="hljs-comment">// Sortir: Bonjour,WORLD!</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans cet exemple, MB_strtoupper () gère correctement les caractères chinois en codés UTF-8 et convertit le "monde" en "monde".
MB_strtoupper () doit spécifier le codage de caractère explicitement. Dans le développement réel, il est recommandé d'utiliser toujours le codage UTF-8, ce qui garantit que le programme n'a pas de problèmes bronzés lors de la gestion des caractères dans diverses langues. Si aucun encodage n'est spécifié, MB_strtoupper () peut dépendre du codage par défaut du système, ce qui peut conduire à un comportement inattendu.
<span><span><span class="hljs-title function_ invoke__">mb_strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span></span>
Si vous utilisez d'autres encodages, tels que GB2312, vous pouvez modifier les paramètres de codage en conséquence:
<span><span><span class="hljs-title function_ invoke__">mb_strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'GB2312'</span></span><span>);
</span></span>