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.
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.
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>
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>
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>