Aktueller Standort: Startseite> Neueste Artikel> Was tun, wenn Sie FGetCSV verwenden, um CSV -Dateien zu lesen? Detaillierte Lösung für Codierungsprobleme

Was tun, wenn Sie FGetCSV verwenden, um CSV -Dateien zu lesen? Detaillierte Lösung für Codierungsprobleme

gitbox 2025-06-08

1. Warum erscheint der verstümmelte Code bei der Verwendung von FGetCSV ?

FGetCSV () ist eine bequeme Funktion, die von PHP bereitgestellt wird, um CSV -Dateien nach Zeilen zu lesen und jede Datenzeile als Array zurückzugeben. Es wird jedoch nicht automatisch transkodiert. Wenn Sie versuchen, eine in GBK oder Big5- Codierung gespeicherte Datei zu lesen, und Ihre PHP-Umgebung oder Webseitenausgabe UTF-8 ist, wird die Ausgabe verstümmelt.


2. Der Kern der Lösung des Problems des verstümmelten Code: Transcodieren

Um das verstümmelte Problem zu lösen, müssen wir nach dem Lesen jede Datenzeile aus der ursprünglichen Codierung in die Zielcodierung (normalerweise UTF-8) konvertieren. Dies wird normalerweise durch MB_CONVERT_ENCODING () oder ICONV () -Funktionen von PHP erreicht.


3. Komplette Code -Beispiele

Angenommen, wir haben eine GBK-kodierte CSV-Datei, die wir korrekt als UTF-8 anzeigen möchten. Wir können den folgenden Code verwenden:

<Code> <? Php

$ Dateiname = "data.csv"; // Angenommen, die CSV -Datei ist GBK codiert
$ handle = fopen ($ filename, "r");

if ($ Handle! == false) {
while (($ data = fGetcsv ($ Handle))! == false) {
// Konvertieren Sie jede Spalte von GBK in UTF-8
foreach ($ data as & $ field) {
$ field = mb_convert_encoding ($ field, "utf-8", "gbk");
}
unversehrt ($ field); // Zitierprobleme vermeiden

     print_r($data); // Den transkodierten Inhalt ausgeben
}
fclose($handle);

} anders {
echo "Datei kann nicht öffnen: $ Dateiname";
}

?>
</code>


4. Automatische Erkennung und Codierung (erweiterte Praktiken)

Wenn Sie nicht sicher sind, wie hoch die ursprüngliche Codierung der Datei ist, können Sie mb_detekt_encoding () automatisch erkennen:

<Code> <? Php

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

if ($ Handle! == false) {
$ firstline = fGets ($ Handle);
Rückspulen ($ Handle); // Nach dem Lesen der ersten Zeile kehrt der Zeiger zum Beginn der Datei zurück
$ coding = mb_detect_encoding ($ firstline, ["gbk", "utf-8", "big5", "sjis"], true);
if (! $ codieren) {
$ coding = "gbk"; // Wenn es nicht erkannt werden kann, wird GBK standardmäßig verwendet
}

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

} anders {
Echo "Datei kann nicht geöffnet werden";
}

?>
</code>


5. Was ist, wenn CSV über den Browser hochgeladen wird?

Wenn die vom Benutzer hochgeladene CSV -Datei aus verschiedenen Betriebssystemen (Windows, Mac, Linux) stammen kann oder sie durch verschiedene Software (Excel, WPS) gespeichert werden kann, ist die Charaktercodierung derzeit noch unkontrollierbarer. Es wird empfohlen, die Codierung nach dem Hochladen einheitlich zu verarbeiten und dann mit fGetCSV () zu lesen.

Sie können in Betracht ziehen, die hochgeladene CSV -Datei als temporäre Datei zu speichern und die oben genannte automatische Erkennung + Transkodierungsmethode für die einheitliche Verarbeitung zu verwenden:

<Code> <? Php

if (isset ($ _ files ['csvFile']) && $ _files ['csvFile'] ['Fehler'] === 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 "Uploaded -Dateien können nicht gelesen werden";
}

} anders {
echo "Upload fehlgeschlagen oder Datei ungültig";
}

?>
</code>