PHP解壓ZIP壓縮包,解決中文亂碼問題
修復原生ZipArchive的中文亂碼問題
測試環境是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));
//作者: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 ['crc'] == 0) {
//新建目錄
mkdir($toDir.'/'.substr($statInfo['name'], 0,-1));
} else {
//拷貝檔案
copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']);
}
}
print_r(scandir($toDir));
//作者:Dorm_Script
//連結:http://www.jianshu.com/p/3efa924fd809
但是當$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){
if (!is_dir(iconv ( 'UTF-8', 'GB2312', $toDir))) {
mkdir(iconv ( 'UTF-8', 'GB2312', $toDir), 0777, true);
}
//$zip->extractTo($toDir);
$docnum = $zip->numFiles;
for($i = 0; $i < $docnum; $i++) {
$statInfo = $zip->statIndex($i);
if($statInfo['crc'] == 0) {
//新建目錄
mkdir(iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name']), 0777, true);
} else {
//拷貝檔案,特別的改動,iconv的位置決定copy能不能work
if(copy('zip://'.iconv ( 'UTF-8', 'GB2312', $zipName).'#'.$statInfo['name'], iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name'])) == false){
echo 'faild to copy';
}
}
}
print_r(scandir(iconv ( 'UTF-8', 'GB2312',$toDir)));
$zip->close();//關閉處理的zip檔案
}
else{
echo 'failed, code:'.$res.'<br>';
}
上述程式碼的輸出:
Array
(
[0] => .
[1] => ..
[2] => ��
[3] => Ҫ
)
壓縮包的目錄:
中文.zip
├── 不
│ └── 要
│ └── dance.txt
└── 要
└── dance1.txt
相關推薦
PHP解壓ZIP壓縮包,解決中文亂碼問題
修復原生ZipArchive的中文亂碼問題 測試環境是windows10 中文的zip壓縮包名和中文的檔名會導致PHP原生自帶的ZipArchive亂碼,導致extractTo方法失效: &l
Java 解壓zip壓縮包
ice gin inpu ret zipentry .get get next exce 因為最近項目需要批量上傳文件,而這裏的批量就是將文件壓縮在了一個zip包裏,然後讀取文件進行解析文件裏的內容。 因此需要先對上傳的zip包進行解壓。以下直接提供代碼供參考: 1.第一個
C++解壓zip壓縮包(2)
由於上一篇部落格寫的比較急,沒有給出直接執行的程式碼跟演示,這裡我重新寫了一個專案 上一篇部落格C++解壓壓縮檔案 上一篇部落格中有ziputils官網的連結更下載地址,使用方法還是一樣,向專案中新增檔案 #include <Windows.h> //新
python 解壓zip壓縮包
在當前路徑解壓zip壓縮包,生成同名資料夾,內部目錄結構與壓縮包一致 import zipfile import os def un_zip(file_name): """unzip zip file""" zip_file = zipfile.ZipFile(
java壓縮檔案,解決中文亂碼問題!
package TestZIP; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.tools.zip.ZipEnt
python程序解壓rar壓縮包報錯
ould gcc-c++ root 產生 pytho oot exp import 依賴包 運行如下python程序報錯Couldn't find path to unrar library的解決辦法:#!/usr/bin/python #-*- coding:ut
C++解壓zip壓縮檔案
前言 最近做專案需要用到網路下載壓縮檔案並解壓至指定資料夾,本意是使用zlib庫,但是花費許久時間仍沒有編譯通過官網的檔案,於是放棄,轉而尋求其他方法,在之前的部落格中有說道用system呼叫shell命令的方式使用winrar解壓,但是這種方法有一個弊端就是要求客戶端必須安裝winrar,
Android 解壓 Zip 壓縮檔案
文章目錄 1、簡介 2、程式碼結構 3、AndroidManifest.xml 新增 sd 卡讀寫許可權 4、MainActivity 檔案 5、效果檢視
PHP 解壓 ZIP 中的檔案到指定目錄 (不含 ZIP 中的資料夾路徑)
<?php header('Content-type:text/html;charset=utf-8'); $filename = './xiyanhetong20181213.zip'; // 目標原始檔 $dir = 'test_zip'; // 存放目錄
Java呼叫shell命令解壓.7z壓縮包
Linux下解壓.7z壓縮包,java呼叫shell命令執行,解壓速度是java程式解壓的幾十倍乃至更多,首先確認主機上已安裝.7z命令。 package com.annet.upload.core.utils; import java.io.Buffe
php 解壓zip/rar
剛開始學習php,在做php線上解壓壓縮包並讀取檔案的目錄結構的功能,記錄下遇到的問題 1. 剛開始以為可以直接讀取壓縮包的目錄結構(可能我還沒找到方法吧),浪費了好多時間 2. 後來把壓縮包解壓到指定的目錄中,在讀取指定目錄指定資料夾(壓縮包名)的目錄結構,之後刪除該檔案
scala和java解壓zip的檔案,並上傳到hdfs伺服器
之前一直使用的事java開發的,後來學習hadoop,spark以後,需要做一個解壓檔案到伺服器的例子,由於學習scala時間不長,故先用java程式碼寫出來,在改成scala的程式碼,過程中出現了很多問題,我將會在最後說明,請大家注意不要少了包。 環境宣告:windows
Zip壓縮解壓縮_已解決中文亂碼
package com.my.zip; import java.io.BufferedInputStream; import java.io.Closeable; import java.io.File; import java.io.FileInputStr
pdfmake實現中文支持,解決中文亂碼問題
亂碼 build cnblogs js模塊 fonts字體 修改配置 打開 命令 覆蓋 引言:當初自己為了在項目中bootstrap-table中實現導出pdf,使用的pdfmake,但是pdfmake默認使用的不是中文字體,實現pdfmake使用中文字體主要就是編譯新的v
JAVA本地讀取檔案,解決中文亂碼問題
JAVA本地讀取檔案出現中文亂碼,查閱一個大神的部落格做一下記錄 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.Buffered
JAVA本地讀取文件,解決中文亂碼問題
也會 oid users str fileread lock clas puts 字節流 JAVA本地讀取文件出現中文亂碼,查閱一個大神的博客做一下記錄 import java.io.BufferedInputStream;import java.io.Buf
Android 匯出CSV檔案,解決中文亂碼問題
亂碼,無非就是編碼對不上的問題,只要編碼一樣那就沒問題,使用了Okio,直接上程式碼: try { //寫入檔案 String data = stringB
java讀取預設編碼是ansi的文字檔案時,解決中文亂碼問題
// 封裝文字檔案 File file = new File("d:/test11.txt"); // BufferedReader br = new BufferedReader(new FileR
Spring mvc 例項--使用velocity檢視,解決中文亂碼問題
上個星期讀了一些spring mvc原始碼,現在可以將之前的寫的簡單的例子貼出來,為以後的開發作些準備。 這是一個非常簡單的例子,就是使用SimpleFormController實現spring mvc的例子。 首先,在web.xml上配置DispatcherSer
php使用curl post 傳送url 並解決中文亂碼問題
這個問題困擾我幾天了,傳送的指定網址的url引數,中文總是亂碼,指定網址是utf8編碼的,我傳送的也是utf8編碼的。但是還是亂碼,開始用的file_get_contents,後來換成curl並在