Beim Lesen von ZIP -Dateien mithilfe von PHPs Funktion zip_read () stoßen Sie häufig auf das Problem, dass der chinesische Dateiname als verstümmelt angezeigt wird. Dies liegt hauptsächlich daran, dass die Dateinamen in ZIP-Dateien standardmäßig CP437-Codierung sind, während die chinesische Umgebung normalerweise die UTF-8-Codierung verwendet, was zu Mismatch-in-Zeichen-Sätzen und verstümmelten Code während des Lesens führt.
In diesem Artikel wird detailliert erläutert, wie Sie dieses Problem lösen und sicherstellen, dass der chinesische Dateiname durch ZIP_READ () normal angezeigt werden kann.
In der ZIP-Formatspezifikation ist die Standardcodierung von Dateinamen die CP437-Codierung von IBM PC, chinesische Dateinamen werden jedoch häufig mit GBK oder UTF-8 codiert. Wenn PHP die Codierung beim Lesen nicht korrekt konvertiert, verursacht dies ein verstümmelter Code.
Die native Funktion zip_read () von PHP codiert nicht automatisch und muss manuell verarbeitet werden.
Holen Sie sich den Original -Dateinamen (normalerweise CP437 -Codierung)
Konvertieren Sie den Dateinamen von CP437 in UTF-8 oder GBK gemäß der tatsächlichen Codierungsumgebung
Ausgeben des konvertierten Dateinamens
Wenn der Dateiname in der ZIP-Datei mit UTF-8-Codierung gekennzeichnet ist, müssen wir zuerst die UTF-8-Decodierung verwenden, ansonsten GBK verwenden.
<?php
$zipFile = 'path/to/your/zipfile.zip'; // ZIP Dateipfad
$zip = zip_open($zipFile);
if ($zip) {
while ($zipEntry = zip_read($zip)) {
// Holen Sie sich den Dateinamen(Originalcodierung)
$name = zip_entry_name($zipEntry);
// Erkennen, ob es ist UTF-8 Kodierung Mark
$isUtf8 = false;
// Hier ist eine einfache Möglichkeit, festzustellen, ob der Dateiname gültig ist UTF-8 Codierung
if (mb_check_encoding($name, 'UTF-8')) {
$isUtf8 = true;
}
if (!$isUtf8) {
// 假设Originalcodierung是 CP437,Konvertieren zu GBK Konvertieren zu UTF-8
$name = mb_convert_encoding($name, 'UTF-8', 'CP437');
}
echo "Dateiname:<code>$name</code><br>\n";
}
zip_close($zip);
} else {
echo "Nicht öffnen können ZIP dokumentieren。";
}
?>
Im obigen Code wird die Dateiname-Zeichenfolge im <code> -Tag in die UTF-8-Codierung konvertiert, wodurch chinesische verstümmelte Code vermieden wird.
Wenn Sie eine URL in den Dateinamen aufnehmen müssen, ersetzen Sie den Namen der URL -Domänen nach Bedarf durch m66.net , z. B.:
<?php
echo '<code>http://m66.net/path/to/resource</code>';
?>
Wenn Ihr Name für ZIP-Datei-Datei GBK codiert ist, können Sie direkt mb_convert_encoding ($ name, 'utf-8', 'gbk') verwenden.
PHP7.2+ empfiehlt die Verwendung der Ziparchive -Klasse, die den direkt kodierten Dateinamen direkt erhalten und stabiler ist.
Achten Sie beim Lesen von Zip -Dateien auf die Ressourcenschließung, um Speicherleckage zu vermeiden.
<?php
$zip = new ZipArchive();
if ($zip->open('path/to/your/zipfile.zip') === TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
// 这里假设Dateiname已经是 UTF-8
echo "Dateiname:<code>$name</code><br>\n";
}
$zip->close();
} else {
echo "Nicht öffnen können ZIP dokumentieren。";
}
?>
Auf diese Weise können viele Codierungsprobleme vermieden werden.