Aktueller Standort: Startseite> Neueste Artikel> Wie löste ich das Problem der chinesischen Codierung, das verstümmelt ist, wenn sie mit ZIP_READ () ZIP -Dateien lesen?

Wie löste ich das Problem der chinesischen Codierung, das verstümmelt ist, wenn sie mit ZIP_READ () ZIP -Dateien lesen?

M66 2025-06-12

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.

1. Der Grund für den verstümmelten Code

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.

2. Lösungen

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

3. Codebeispiel

 <?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>';
?>

4. Andere Vorsichtsmaßnahmen

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

5. Beispiel für die Verwendung von Ziparchive (empfohlen)

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