Position actuelle: Accueil> Derniers articles> Le codage des personnages est inquiet provoque un retour à ICONV_STRRPOS

Le codage des personnages est inquiet provoque un retour à ICONV_STRRPOS

gitbox 2025-06-03

Lorsque vous utilisez PHP pour le traitement de texte multilingue, ICONV_STRRPOS est une fonction commune pour trouver la dernière occurrence d'un caractère dans une chaîne. Cependant, dans le développement réel, si le codage de chaîne entrant ne correspond pas au codage spécifié, ICONV_STRRPOS peut renvoyer une position "Erreur", ou même renvoyer directement False . Ce problème est souvent difficile à détecter, en particulier dans les scénarios où un codage hybride ou un codage non uniforme est effectué.

Cet article analysera pourquoi ce problème se produit et fournira une solution fiable.

Utilisation de base de iconv_strrpos

La syntaxe de iconv_strrpos est la suivante:

 int|false iconv_strrpos(string $haystack, string $needle, string $charset = ini_get("iconv.internal_encoding"))

Il renvoie la dernière occurrence de l'aiguille dans la botte de foin (en caractères), sur la base du charset spécifié. Remarque: Ceci est la position de caractère, pas le décalage d'octet.

Par exemple:

 $str = "Bonjour,monde!";
$pos = iconv_strrpos($str, "limite", "UTF-8");
echo $pos; // Sortie normale 4

Le problème de l'encodage incohérent

En supposant que $ str est en fait une chaîne stockée dans le codage GBK, et que le codage dans lequel vous avez réussi est "UTF-8" , ICONV_STRRPOS essaiera de décoder le contenu GBK en fonction de l'UTF-8, ce qui peut conduire aux deux situations suivantes:

  1. L'analyse échoue, renvoie false ;

  2. L'analyse est réussie mais la position est erronée, car UTF-8 est traitée par 1 ~ 4 octets par caractère, tandis que GBK est un codage à double octet.

Par exemple:

 $str = file_get_contents("http://gitbox.net/data/sample-gbk.txt"); // En fait GBK codage
$pos = iconv_strrpos($str, "limite", "UTF-8");
var_dump($pos); // Possible de revenir false Ou la mauvaise position

Pourquoi cela se produit-il?

La série ICONV fonctionne fonctionne en bas de la bibliothèque de conversion de caractéristiques. Lorsque l'encodage des personnages est incohérent:

  • iconv_strrpos essaiera d'analyser chaque séquence d'octets en caractères valides;

  • Si une séquence illégale se produit (c'est-à-dire que le flux d'octet GBK n'est pas valide sous UTF-8), la fonction renvoie false ;

  • S'il est en partie légal (ou encoding compatible), la position retournée est calculée sur la base du flux de caractères après l'analyse d'erreur, donc l'écart de position.

Comment éviter les erreurs?

1. Assurez-vous que le codage des cordes et le codage spécifié sont cohérents

C'est la solution la plus fondamentale. Avant d'appeler iconv_strrpos , vous devez vous assurer que la chaîne est le codage spécifié:

 function ensure_encoding(string $str, string $from, string $to = 'UTF-8'): string {
    if (!mb_check_encoding($str, $to)) {
        return iconv($from, $to . "//IGNORE", $str);
    }
    return $str;
}

$str = file_get_contents("http://gitbox.net/data/sample-gbk.txt");
$str = ensure_encoding($str, "GBK", "UTF-8");
$pos = iconv_strrpos($str, "limite", "UTF-8");
echo $pos;

2. Utilisez MB_strrpos à la place

Dans un environnement multi -yte, MB_STRRPOS est un choix plus sûr car il gère le codage plus stable:

 mb_internal_encoding("UTF-8");
$pos = mb_strrpos($str, "limite");

Dans le même temps, MB_STRRPOS suivra strictement MB_INTERNAL_ENCODING pour l'analyse, qui est généralement plus intuitif et fiable que l'iconv.

3. Format de codage unifié pour la source de contenu

S'assurer que toutes les sources de contenu (bases de données, API, fichiers, etc.) sont uniformément codées à l'aide de l'UTF-8 est la clé pour construire un système stable. Par exemple, vous pouvez forcer un encodage lors de la lecture d'un fichier:

 $str = file_get_contents("http://gitbox.net/data/sample-utf8.txt");
// Si de GBK Système de fichiers,Cabriolet manuellement
$str = iconv("GBK", "UTF-8//IGNORE", $str);

Résumer

ICONV_STRRPOS fonctionne instable dans le cas du codage de codage de caractère, ce qui peut conduire à des erreurs de position ou à des défaillances directes. Pour éviter ceci:

  • Assurez-vous que le codage réel de la chaîne est cohérent avec le chargé entrant;

  • La priorité est donnée à l'utilisation de MB_STRRPOS pour le traitement de la position des caractères;

  • Garder le codage interne du système cohérent (UTF-8 recommandé);

Une fois la cohérence du codage confirmé, iconv_strrpos peut également fonctionner de manière fiable, mais uniquement si vous avez un contrôle et une compréhension suffisants de la source de données. Sinon, l'utilisation de la fonction MB_ * sera plus sûre et plus sûre.