1. 程式人生 > >PHP解壓ZIP壓縮包,解決中文亂碼問題

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

相關推薦

PHPZIP壓縮解決中文亂碼問題

修復原生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和javazip的檔案並上傳到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並在