Position actuelle: Accueil> Derniers articles> Que faire si vous utilisez FGETCSV pour lire les fichiers CSV? Solution détaillée aux problèmes de codage

Que faire si vous utilisez FGETCSV pour lire les fichiers CSV? Solution détaillée aux problèmes de codage

gitbox 2025-06-08

1. Pourquoi le code brouillé apparaît-il lors de l'utilisation de FGETCSV ?

FGETCSV () est une fonction pratique fournie par PHP pour lire les fichiers CSV par ligne et renvoyer chaque ligne de données en tant que tableau. Cependant, il ne se transcodera pas automatiquement. Si vous essayez de lire un fichier enregistré dans le codage GBK ou BIG5 , et que votre environnement PHP ou votre sortie de page Web est UTF-8 , la sortie semblera brouillée.


2. Le cœur de la résolution du problème du code brouillé: transcoding

Pour résoudre le problème brouillé, nous devons convertir chaque rangée de données de l'encodage d'origine au codage cible (généralement UTF-8) après l'avoir lu. Ceci est généralement réalisé via les fonctions MB_Convert_encoding () ou iconv () de PHP.


3. Compléter des exemples de code

Supposons que nous ayons un fichier CSV codé par GBK que nous souhaitons afficher correctement en tant que UTF-8, nous pouvons utiliser le code suivant:

<code> <? Php

$ filename = "data.csv"; // Supposons que le fichier CSV est codé par GBK
$ handle = fopen ($ filename, "r");

if ($ handle! == false) {
while (($ data = fgetcsv ($ handle))! == false) {
// Convertir chaque colonne de GBK en UTF-8
foreach ($ data as & $ champ) {
$ field = mb_convert_encoding ($ field, "utf-8", "gbk");
}
unset ($ field); // Évitez les problèmes de citation

     print_r($data); // Sortir le contenu transcodé
}
fclose($handle);

} autre {
Echo "Impossible d'ouvrir le fichier: $ nom de fichier";
}

?>
</code>


4. Détection et codage automatique (pratiques avancées)

Si vous n'êtes pas sûr du codage d'origine du fichier, vous pouvez utiliser MB_DETECT_ENCODING () pour détecter automatiquement:

<code> <? Php

$ filename = "data.csv";
$ handle = fopen ($ filename, "r");

if ($ handle! == false) {
$ firstline = fgets ($ manche);
Rewind ($ manche); // Après avoir lu la première ligne, le pointeur revient au début du fichier
$ encoding = MB_DETECT_ENCODING ($ firstline, ["gbk", "utf-8", "big5", "sjis"], true);
if (! $ Encoding) {
$ encoding = "gbk"; // s'il ne peut pas être détecté, GBK est utilisé par défaut
}

 while (($data = fgetcsv($handle)) !== false) {
    foreach ($data as &$field) {
        $field = mb_convert_encoding($field, "UTF-8", $encoding);
    }
    unset($field);
    print_r($data);
}
fclose($handle);

} autre {
Echo "Le fichier ne peut pas être ouvert";
}

?>
</code>


5. Et si CSV est téléchargé via le navigateur?

Si le fichier CSV téléchargé par l'utilisateur peut provenir de différents systèmes d'exploitation (Windows, Mac, Linux), ou il peut être enregistré par différents logiciels (Excel, WPS), le codage des caractères est encore plus incontrôlable à ce moment. Il est recommandé de traiter le codage uniformément après le téléchargement, puis de le lire avec fGetCSv () .

Vous pouvez envisager d'enregistrer le fichier CSV téléchargé en tant que fichier temporaire et d'utiliser la méthode de détection automatique ci-dessus + transcodage pour le traitement unifié:

<code> <? Php

if (isset ($ _ fichiers ['csvfile']) && $ _files ['csvfile'] ['error'] === upload_err_ok) {
$ tmpfile = $ _files ['csvfile'] ['tmp_name'];
$ handle = fopen ($ tmpfile, "r");

 if ($handle !== false) {
    $firstLine = fgets($handle);
    rewind($handle);
    $encoding = mb_detect_encoding($firstLine, ["GBK", "UTF-8", "BIG5", "SJIS"], true);
    if (!$encoding) {
        $encoding = "GBK";
    }

    while (($data = fgetcsv($handle)) !== false) {
        foreach ($data as &$field) {
            $field = mb_convert_encoding($field, "UTF-8", $encoding);
        }
        unset($field);
        print_r($data);
    }
    fclose($handle);
} else {
    echo "Impossible de lire les fichiers téléchargés";
}

} autre {
ECHO "Téléchargez l'échec ou le fichier invalide";
}

?>
</code>