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

2021-08-09 03:33:28 字數 1863 閱讀 6106

測試環境是windows10

中文的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));

<?php

$zip = new \ziparchive;

$zipfile = "./test.zip";

$res = $zip->open($zipfile);

$todir = "./test";

if(!file_exists($todir))

$docnum = $zip->numfiles;

for($i = 0; $i

< $docnum; $i++) else

}print_r(scandir($todir));

但是當$zipfile是中文編碼時,也就是壓縮包的名稱是中文時,解壓仍然會失敗。

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

//zip檔名

$filename = '中文.zip';

//zip檔案相對伺服器根目錄的儲存路徑

$uploads_dir = "/public/zipupload";

//zip檔案完整的儲存路徑

$zipname = $_server['document_root'].$uploads_dir.'/'.$filename;

//將目標路徑名稱賦值為filename最後的'.zip'四個字元之外的全部字元構成的字串

$todir = $_server['document_root'].$uploads_dir.'/'.substr($filename,0,strlen($filename)-4);

$zip = new \ziparchive;//新建乙個ziparchive的物件

/* 通過ziparchive的物件處理zip檔案

$zip->open這個方法的引數表示處理的zip檔名。

如果對zip檔案物件操作成功,$zip->open這個方法會返回true

*/$res = $zip->open(iconv ( 'utf-8', 'gb2312', $zipname));

if ($res === true)

//$zip->extractto($todir);

$docnum = $zip->numfiles;

for($i = 0; $i

< $docnum; $i++) else }}

print_r(scandir(iconv ( 'utf-8', 'gb2312',$todir)));

$zip->close();//關閉處理的zip檔案

}else

上述**的輸出:

array

( [0] => .

[1] => ..

[2] => ��

[3] => ҫ

)

壓縮包的目錄:

中文.zip

├── 不

│ └── 要

│ └── dance.txt

└── 要

└── dance1.txt

PHP上傳ZIP壓縮包並解壓

因為專案上面的需要,所以研究了php解壓壓縮包,當然php不止這一種解壓方式,個人覺得是比較方便的辦法,不需要安裝其他的擴充套件。獲取表單提交的壓縮檔案 file files file 獲取檔名 name file name 獲取絕對路徑 path getcwd 定義檔案儲存路徑 filepath ...

zip壓縮包解壓亂碼問題

由於zip格式中並沒有指定編碼格式,windows下生成的zip檔案中的編碼是gbk gb2312等,因此,導致這些zip檔案在linux下解壓時出現亂碼問題,因為linux下的預設編碼是utf8。目前網上流傳一種unzip o cp936的方法,但一些unzip是沒有 o這個選項的。unzip o...

PHP生成zip壓縮包

我們將乙個檔案生成乙個壓縮包。path c wamp www log.txt filename test.zip zip new ziparchive zip open filename,ziparchive create 開啟壓縮包 zip addfile path,basename path 向...