首页后端开发PHPPHP用ZipArchive解压造成中文乱码如何处理

PHP用ZipArchive解压造成中文乱码如何处理

时间2024-03-22 09:25:03发布访客分类PHP浏览1166
导读:在实际案例的操作过程中,我们可能会遇到“PHP用ZipArchive解压造成中文乱码如何处理”这样的问题,那么我们该如何处理和解决这样的情况呢?这篇小编就给大家总结了一些方法,具有一定的借鉴价值,希望对大家有所帮助,接下来就让小编带领大家一...
在实际案例的操作过程中,我们可能会遇到“PHP用ZipArchive解压造成中文乱码如何处理”这样的问题,那么我们该如何处理和解决这样的情况呢?这篇小编就给大家总结了一些方法,具有一定的借鉴价值,希望对大家有所帮助,接下来就让小编带领大家一起了解看看吧。


php压缩中文乱码的解决方法:1、通过“composer require nelexa/zip”安装PhpZip;2、打开“ZipFile.php”;3、找到“extractTo”方法,将“is_writable”函数改掉或去掉;4、转换一下编码格式即可。

怎么解决php压缩中文乱码问题?

解决php使用ZipArchive解压时中文乱码问题(纯php,绕开ZipArchive)

解决php使用ZipArchive解压时中文乱码问题

使用php自带的ZipArchive来解压带中文文件名压缩包时会造成乱码,现象如下:

网上查阅基本上给出的答案大同小异,自己照着同样的方法试了都不能解决,下图是网上给出的方案:

经过摸索终于找到了解决方案,那就是弃用ZipArchive,选择其他的途径,经过比较我选择了“PhpZip”,优点是:纯php(不需要扩展和类),下面介绍安装方法:

composer安装:

composer require nelexa/zip
登录后复制

如果选择版本的话:composer require nelexa/zip:^3.0 (3.0版本号)

使用方法:

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

注释:(**如果安装好使用正常请忽略下面的注释内容**)

1.我的压缩包放在共享盘里面连接的是smb地址,可能会出现报错:"Destination is not writable directory",这个坑已经踩过:打开ZipFile.php这个文件,找到“extractTo”方法,将“is_writable”函数改掉,或者去掉,然后再转换一下编码格式!,下面有注释的是我修改的内容!

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

    }
    
登录后复制



关于“PHP用ZipArchive解压造成中文乱码如何处理”的内容就介绍到这,感谢各位的阅读,相信大家对PHP用ZipArchive解压造成中文乱码如何处理已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: PHP用ZipArchive解压造成中文乱码如何处理
本文地址: https://pptw.com/jishu/650318.html
Oracle中decode函数形式有几种,如何使用 Oracle触发器主键自增怎么做,触发器能用来做什么

游客 回复需填写必要信息