Position actuelle: Accueil> Derniers articles> Comment garder le codage d'origine inchangé après avoir utilisé MB_SCRUB pour nettoyer la chaîne?

Comment garder le codage d'origine inchangé après avoir utilisé MB_SCRUB pour nettoyer la chaîne?

gitbox 2025-08-13

Lorsque vous traitez avec des chaînes de multicette, MB_SCRUB est une fonction très pratique qui peut nous aider à nettoyer les chaînes contenant des caractères illégaux et à empêcher le programme de s'écraser en raison de problèmes de codage pendant le traitement ultérieur. Cependant, de nombreux développeurs rencontreront un problème après avoir utilisé MB_SCRUB :. Cela peut provoquer un codage de confusion dans le système, en particulier lorsque votre application dépend de codages spécifiques (tels que Shift_Jis, ISO-8859-1, etc.).

Alors, comment puis-je garder le codage original inchangé après avoir utilisé MB_SCRUB pour nettoyer la chaîne?

Analyse des problèmes

Regardons d'abord l'utilisation de base de MB_SCRUB :

 <span><span><span class="hljs-variable">$clean</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>);
</span></span>

Si aucun encodage n'est spécifié, PHP utilise le codage des caractères internes par défaut (généralement UTF-8). MB_SCRUB essaiera de convertir la chaîne en codage spécifié, et si la conversion échoue, remplacez les caractères illégaux par U + FFFD (?). Cependant, le codage de la valeur de retour est souvent le codage spécifié lorsque vous le transmettez, plutôt que le codage de la chaîne d'origine.

Donc, si votre chaîne a été encodée à l'origine Shift_Jis et que vous la nettoyez avec la MB_SCRUB ($ STR) par défaut, vous vous retrouvez avec une chaîne codée UTF-8, ce qui peut entraîner un code brouillé ou une incompatibilité du système.

Solution: spécifiez explicitement le codage d'origine

Pour résoudre ce problème, vous devez d'abord détecter le codage de la chaîne d'origine , puis passer explicitement le codage lorsque MB_SCRUB est appelé. Par exemple:

 <span><span><span class="hljs-variable">$original_encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>, </span><span><span class="hljs-title function_ invoke__">mb_list_encodings</span></span><span>(), </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$clean_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>, </span><span><span class="hljs-variable">$original_encoding</span></span><span>);
</span></span>

De cette façon, MB_SCRUB saura quelle méthode d'encodage pour comprendre la chaîne, et la valeur de retour utilisera également le même codage.

Remarque: La précision de MB_DETECT_ENCODING dépend du contenu de la chaîne et de la liste codée passée. Certains encodages vagues peuvent ne pas être correctement identifiés. Il est recommandé de définir la portée le plus clairement possible en fonction du contexte.

Exemples plus rigoureux

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">clean_preserve_encoding</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$input</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, [</span><span><span class="hljs-string">'SJIS'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'ISO-8859-1'</span></span><span>, </span><span><span class="hljs-string">'EUC-JP'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$encoding</span></span><span>) {
        </span><span><span class="hljs-comment">// Impossible de détecter le codage,Utilisé par défaut UTF-8,Ou lancer une exception</span></span><span>
        </span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
    }
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
}
</span></span>

Cette fonction fera de son mieux pour préserver le codage de la chaîne d'entrée et n'endommagera pas la cohérence du codage même lorsque des caractères illégaux apparaissent dans le contenu.

Suggestions supplémentaires

  1. Enregistrez toujours le codage original : si votre système doit prendre en charge plusieurs encodages, c'est une bonne habitude d'enregistrer le codage de chaque morceau de texte dans le flux de données.

  2. La priorité est donnée à UTF-8 : Si vous pouvez contrôler l'environnement d'entrée et de sortie, il est recommandé d'utiliser le codage UTF-8 aussi uniformément que possible pour éviter la complexité causée par le mélange de plusieurs encodages.

  3. Testez des situations extrêmes : en particulier lors du traitement des données externes, vous devez tester les octets illégaux mixtes, le mauvais bom, le codage incohérent, etc.

Résumer

Le nettoyage des chaînes illégales avec MB_SCRUB est un moyen important de manipuler en toute sécurité des chaînes de multicette, mais elle peut modifier le format de codage de la chaîne lorsqu'il n'est pas explicitement spécifié. Pour éviter ce problème, le codage d'origine doit être spécifié explicitement lors de l'appel MB_SCRUB , afin de s'assurer que la chaîne nettoyée conserve toujours le codage d'origine.

Cela maintient non seulement la cohérence des données, mais réduit également les effets secondaires de la conversion de codage. Il s'agit d'une compétence pratique indispensable lors du développement d'applications compatibles multi-langues et multi-codantes.