Home  >  Article  >  Backend Development  >  How to solve the problem of php compressed Chinese garbled characters

How to solve the problem of php compressed Chinese garbled characters

藏色散人
藏色散人Original
2022-11-14 10:25:041796browse

Solution to php compressed Chinese garbled characters: 1. Install PhpZip through "composer require nelexa/zip"; 2. Open "ZipFile.php"; 3. Find the "extractTo" method and change the "is_writable" function Remove or remove; 4. Convert the encoding format.

How to solve the problem of php compressed Chinese garbled characters

The operating environment of this tutorial: Windows 7 system, PHP version 8.1, Dell G3 computer.

How to solve the problem of php compressed Chinese garbled characters?

Solve the problem of Chinese garbled characters when php is decompressed using ZipArchive (pure PHP, bypass ZipArchive)

Solve the problem of Chinese garbled characters when php is decompressed using ZipArchive

Use php to automatically When you use ZipArchive to decompress a compressed package with a Chinese file name, it will cause garbled characters. The phenomenon is as follows:

How to solve the problem of php compressed Chinese garbled characters

Basically the answers given online are similar, so follow the same method yourself. I couldn't solve it even after trying it. The picture below is the solution given on the Internet:

How to solve the problem of php compressed Chinese garbled characters

#After much exploration, I finally found the solution, which is to abandon ZipArchive and choose other ways. For comparison, I chose "PhpZip". The advantage is: pure PHP (no extensions and classes required). Here is the installation method:

composer installation:

composer require nelexa/zip

If you choose the version: composer require nelexa /zip:^3.0 (3.0 version number)

Usage:

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

Comments: (**If it is installed and used normally, please ignore the following comments**)

1. My compressed package is placed in the shared disk and connected to the smb address. An error message may appear: "Destination is not writable directory". This pitfall has been traversed before: open the ZipFile.php file and find the "extractTo" method. Change or remove the "is_writable" function, and then convert the encoding format! , the comments below are what I modified!

/**
     * 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;
    }

Recommended learning: "PHP Video Tutorial"

The above is the detailed content of How to solve the problem of php compressed Chinese garbled characters. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn