Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das Problem PHP-komprimierter chinesischer verstümmelter Zeichen

So lösen Sie das Problem PHP-komprimierter chinesischer verstümmelter Zeichen

藏色散人
藏色散人Original
2022-11-14 10:25:041956Durchsuche

Lösung für verstümmelte chinesische Zeichen bei der PHP-Komprimierung: 1. Installieren Sie PHPZip über „composer require nelexa/zip“. 2. Öffnen Sie „ZipFile.php“. 3. Suchen Sie die Methode „extractTo“ und ändern oder entfernen Sie die Funktion „is_writable“. ; 4. Konvertieren Sie einfach das Kodierungsformat.

So lösen Sie das Problem PHP-komprimierter chinesischer verstümmelter Zeichen

Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 8.1, Dell G3-Computer.

Wie kann das Problem der PHP-komprimierten chinesischen verstümmelten Zeichen gelöst werden?

Lösen Sie das Problem chinesischer verstümmelter Zeichen, wenn PHP mit ZipArchive dekomprimiert wird (reines PHP, umgehen Sie ZipArchive).

Lösen Sie das Problem chinesischer verstümmelter Zeichen, wenn PHP mit ZipArchive dekomprimiert wird.

Verwenden Sie PHPs eigenes ZipArchive, um komprimierte Pakete mit Chinesisch zu dekomprimieren Dateinamen führen dazu, dass der Code verstümmelt ist und das folgende Phänomen auftritt:

So lösen Sie das Problem PHP-komprimierter chinesischer verstümmelter Zeichen

Grundsätzlich sind die Antworten bei Online-Suchen ähnlich. Ich habe die gleiche Methode ausprobiert, konnte sie aber nicht lösen Online angegeben:

So lösen Sie das Problem PHP-komprimierter chinesischer verstümmelter Zeichen

Nach dem Herumtasten habe ich es endlich gefunden. Die Lösung besteht darin, ZipArchive aufzugeben und andere Wege zu wählen. Der Vorteil ist: reines PHP (keine Erweiterungen und Klassen erforderlich). Hier ist die Installationsmethode:

Composer-Installation:

composer require nelexa/zip

Wenn Sie die Version wählen: Composer erfordert nelexa/zip:^3.0 (Versionsnummer 3.0)

Verwendung:

//解压文件
$fileAddess = "压缩包地址";
$toDir = "解压目录";
$zipFile = new \PhpZip\ZipFile();
$zipFile->openFile($fileAddess) // open archive from file
->extractTo($toDir); // extract files to the specified directory
$zipFile->close();

Hinweise: (**Wenn es installiert ist und Bei normaler Verwendung ignorieren Sie bitte die folgenden Kommentare**)

1. Das komprimierte Paket wird auf der freigegebenen Festplatte abgelegt und mit der SMB-Adresse verbunden. Möglicherweise wird eine Fehlermeldung angezeigt: „Ziel ist kein beschreibbares Verzeichnis“. Vorher durchlaufen: Öffnen Sie die Datei ZipFile.php, suchen Sie die Methode „extractTo“ und ändern Sie „is_writable“. Ändern Sie die Funktion oder entfernen Sie sie und konvertieren Sie dann das Codierungsformat! , die Kommentare unten sind das, was ich geändert habe!

/**
     * Extract the archive contents
     *
     * Extract the complete archive or the given files to the specified destination.
     *
     * @param string $destination Location where to extract the files.
     * @param array|string|null $entries The entries to extract. It accepts either
     *                                   a single entry name or an array of names.
     * @return ZipFile
     * @throws ZipException
     */
    public function extractTo($destination, $entries = null)
    {
        if (!file_exists($destination)) {
            throw new ZipException("Destination " . $destination . " not found");
        }
        if (!is_dir($destination)) {
            throw new ZipException("Destination is not directory");
        }
        $is_really_writable = $this->is_really_writable($destination);
        if (!$is_really_writable) {
            throw new ZipException("Destination is not writable directory");
        }
        /**
         * @var ZipEntry[] $zipEntries
         */
        if (!empty($entries)) {
            if (is_string($entries)) {
                $entries = (array)$entries;
            }
            if (is_array($entries)) {
                $entries = array_unique($entries);
                $flipEntries = array_flip($entries);
                $zipEntries = array_filter(
                    $this->centralDirectory->getEntries(),
                    function ($zipEntry) use ($flipEntries) {
                        /**
                         * @var ZipEntry $zipEntry
                         */
                        return isset($flipEntries[$zipEntry->getName()]);
                    }
                );
            }
        } else {
            $zipEntries = $this->centralDirectory->getEntries();
        }
        foreach ($zipEntries as $entry) {
            /******************************王天佑添加的逻辑start************************************/
            header("Content-type:text/html;charset=bgk");
            $entry_getName = iconv('GB2312', 'UTF-8//ignore',$entry->getName());
            //header("Content-type:text/html;charset=utf-8");
            /******************************王天佑添加的逻辑start************************************/
            $file = $destination . DIRECTORY_SEPARATOR . $entry_getName;
            if ($entry->isDirectory()) {
                if (!is_dir($file)) {
                    if (!mkdir($file, 0755, true)) {
                        throw new ZipException("Can not create dir " . $file);
                    }
                    chmod($file, 0755);
                    touch($file, $entry->getTime());
                }
                continue;
            }
            $dir = dirname($file);
            if (!is_dir($dir)) {
                if (!mkdir($dir, 0755, true)) {
                    throw new ZipException("Can not create dir " . $dir);
                }
                chmod($dir, 0755);
                touch($dir, $entry->getTime());
            }
            if (file_put_contents($file, $entry->getEntryContent()) === false) {
                throw new ZipException('Can not extract file ' . $entry_getName);
            }
            touch($file, $entry->getTime());
        }
        return $this;
    }
    //王天佑加的新逻辑,判断目录是否可写
    public function is_really_writable($file){
        if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) {
            return is_writable($file);
        }
        if (is_dir($file)) {
            $file = rtrim($file, '/') . '/' . md5(mt_rand(1,100) . mt_rand(1,100));
            if (($fp = @fopen($file, "w+")) === FALSE) {
                return FALSE;
            }
            fclose($fp);
            @chmod($file, 0777);
            @unlink($file);
        } elseif (!is_file($file) OR ($fp = @fopen($file, "r+")) === FALSE) {
            fclose($fp);
            return FALSE;
        }
        return TRUE;
    }

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem PHP-komprimierter chinesischer verstümmelter Zeichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn