Position actuelle: Accueil> Derniers articles> MB_GET_INFO Encodage Support dans l'opération d'inversion de chaîne

MB_GET_INFO Encodage Support dans l'opération d'inversion de chaîne

gitbox 2025-05-11

Lors du traitement des chaînes multi-octets (telles que l'UTF-8 chinois codés, japonais, coréenne, etc.), les fonctions de chaîne ordinaires ne parviennent souvent pas à identifier correctement les limites des caractères, ce qui entraîne des résultats de fonctionnement incorrects. Cela est particulièrement vrai lors de l'exécution des opérations de chaîne inverse. Cet article explorera comment obtenir les informations de codage d'une chaîne multi -yte via mb_get_info () et combinez d'autres fonctions MB_Series pour réaliser l'inversion correcte de la chaîne.

Le défi des cordes multi-octets

Les fonctions intégrées de PHP telles que Strrev () ne peuvent gérer que les caractères ASCII, et seront inversés octets pour les caractères multi-octets (tels que "vous" en chinois sont de 3 octets en UTF-8), ce qui entraîne un code brouillé. Exemple:

 $str = "Bonjour,monde";
echo strrev($str); // Sortir du code brouillé

La raison en est que Strrev () ne sait pas combien d'octets un "personnage" est.

Solution: utilisez la fonction MBSTring

L'extension MBSTring de PHP fournit une collection de fonctions qui gèrent les chaînes de mulabilte. Nous pouvons utiliser MB_GET_INFO () pour confirmer la configuration actuelle de multi -yte et combiner MB_Strlen () et MB_substr () pour obtenir une inversion de chaîne sûre.

1. Obtenez l'environnement multilingue actuel

 $info = mb_get_info();
print_r($info);

Cela renverra un tableau comprenant le codage interne ( interne_encoding ), le codage d'entrée / sortie HTTP, etc.:

 Array
(
    [internal_encoding] => UTF-8
    [http_input] => pass
    [http_output] => pass
    ...
)

2. Fonction d'inversion de chaîne

Nous pouvons inverser en toute sécurité une chaîne en fonction des informations de codage actuelles:

 function mb_strrev($str, $encoding = null) {
    if ($encoding === null) {
        $encoding = mb_internal_encoding();
    }
    
    $length = mb_strlen($str, $encoding);
    $reversed = '';
    
    for ($i = $length - 1; $i >= 0; $i--) {
        $reversed .= mb_substr($str, $i, 1, $encoding);
    }
    
    return $reversed;
}

$str = "Bonjour,monde";
echo mb_strrev($str); // Sortir:Monde,Ok toi

Dans cet exemple, nous utilisons mb_internal_encoding () (qui est déterminé par le champ interne_encoding fourni par mb_get_info () ) pour s'assurer que le codage de caractères correct est utilisé.

Support de codage dynamique

Si vous avez affaire à des chaînes de différentes sources (telles que les téléchargements d'utilisateurs), le codage peut ne pas être uniforme. Vous pouvez utiliser mb_detect_encoding () combiné avec mb_convert_encoding () pour convertir:

 $str = file_get_contents('https://gitbox.net/data.txt');
$encoding = mb_detect_encoding($str, mb_detect_order(), true);

if ($encoding !== 'UTF-8') {
    $str = mb_convert_encoding($str, 'UTF-8', $encoding);
}

echo mb_strrev($str);

De cette façon, que l'utilisateur télécharge le texte codé GB2312, BIG5 ou UTF-8, il peut être converti en codage unifié puis inversé.

Résumer

MB_GET_INFO () lui-même ne participe pas directement aux opérations d'inversion de chaîne, mais il fournit des informations de codage critiques, ce qui nous permet de sélectionner les paramètres MB_FUNCTION appropriés. En obtenant et en définissant correctement l'encodage, en combinant MB_Strlen () et MB_SubStr () , nous pouvons inverser les chaînes multipyte en toute sécurité et de manière fiable.

Ceci est particulièrement important lors de l'application de l'international, du traitement des entrées des utilisateurs ou des systèmes de construction pour le marché asiatique. Si vous construisez un tel projet, assurez-vous d'activer la prolongation de MbString et faites toujours attention à l'acquisition et à l'utilisation d'informations codées.