首頁  >  文章  >  後端開發  >  如何解決php壓縮中文檔名亂碼問題

如何解決php壓縮中文檔名亂碼問題

藏色散人
藏色散人原創
2021-06-03 09:09:563773瀏覽

php壓縮中文檔案名稱亂碼的解決方法:先將中文壓縮包名用iconv函數轉碼;然後透過ZipArchive的物件處理zip檔即可。

如何解決php壓縮中文檔名亂碼問題

本文操作環境:Windows10系統、PHP7.1版,DELL G3電腦

PHP解壓縮ZIP壓縮包,解決中文亂碼問題

修復原生ZipArchive的中文亂碼問題

中文的zip壓縮包名和中文的檔名會導致PHP原生自帶的ZipArchive亂碼,導致extractTo方法失效:

<?php
$zip = new \ZipArchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);
$toDir = "./test";
$s = $zip->extractTo($toDir);
print_r(scandir($toDir));
//作者:Dorm_Script
//链接:http://www.jianshu.com/p/3efa924fd809

參考一篇blog,原作的解決方法是:

<?php
$zip = new \ZipArchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);
$toDir = "./test";
if(!file_exists($toDir)) {
    mkdir($toDir);
}
$docnum = $zip->numFiles;
for($i = 0; $i < $docnum; $i++) {
    $statInfo = $zip->statIndex($i);
    if($statInfo[&#39;crc&#39;] == 0) {
        //新建目录
        mkdir($toDir.&#39;/&#39;.substr($statInfo[&#39;name&#39;], 0,-1));
    } else {
        //拷贝文件
        copy(&#39;zip://&#39;.$zipfile.&#39;#&#39;.$statInfo[&#39;name&#39;], $toDir.&#39;/&#39;.$statInfo[&#39;name&#39;]);
    }
}
print_r(scandir($toDir));
//作者:Dorm_Script
//链接:http://www.jianshu.com/p/3efa924fd809

但是當$zipfile是中文編碼時,也就是壓縮套件的名稱是中文時,解壓縮還是會失敗。

此時單獨再將中文壓縮包名用iconv函數轉碼後再使用:

    //zip文件名
        $fileName = &#39;中文.zip&#39;;
        //zip文件相对服务器根目录的保存路径
        $uploads_dir = "/Public/zipUpload";
        //zip文件完整的保存路径
        $zipName = $_SERVER[&#39;DOCUMENT_ROOT&#39;].$uploads_dir.&#39;/&#39;.$fileName;
        //将目标路径名称赋值为fileName最后的&#39;.zip&#39;四个字符之外的全部字符构成的字符串
        $toDir = $_SERVER[&#39;DOCUMENT_ROOT&#39;].$uploads_dir.&#39;/&#39;.substr($fileName,0,strlen($fileName)-4);
        $zip = new \ZipArchive;//新建一个ZipArchive的对象
        /*
        通过ZipArchive的对象处理zip文件
        $zip->open这个方法的参数表示处理的zip文件名。
        如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
        */
        $res = $zip->open(iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;, $zipName));
        if ($res === TRUE){
            if (!is_dir(iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;, $toDir))) {
                mkdir(iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;, $toDir), 0777, true);
            }
            //$zip->extractTo($toDir);
            $docnum = $zip->numFiles;
            for($i = 0; $i < $docnum; $i++) {
                $statInfo = $zip->statIndex($i);
                if($statInfo[&#39;crc&#39;] == 0) {
                    //新建目录
                    mkdir(iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;, $toDir.&#39;/&#39;.$statInfo[&#39;name&#39;]), 0777, true);
                } else {
                    //拷贝文件,特别的改动,iconv的位置决定copy能不能work
                    if(copy(&#39;zip://&#39;.iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;, $zipName).&#39;#&#39;.$statInfo[&#39;name&#39;], iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;, $toDir.&#39;/&#39;.$statInfo[&#39;name&#39;])) == false){
                        echo &#39;faild to copy&#39;;
                    }
                }
            }
            print_r(scandir(iconv ( &#39;UTF-8&#39;, &#39;GB2312&#39;,$toDir)));
            $zip->close();//关闭处理的zip文件
        }
        else{
            echo &#39;failed, code:&#39;.$res.&#39;<br>&#39;;
        }

上述程式碼的輸出:

Array
(
    [0] => .
    [1] => ..
    [2] => ��
    [3] => Ҫ
)

壓縮包的目錄:

 中文.zip

├── 不

│   └── 要

│       └── dance.txt

##若要

    └── dance1.txt

推薦學習:《PHP影片教學

以上是如何解決php壓縮中文檔名亂碼問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn