>  기사  >  백엔드 개발  >  PHP zip 압축 해제 시 문자가 깨지는 문제를 해결하는 방법

PHP zip 압축 해제 시 문자가 깨지는 문제를 해결하는 방법

藏色散人
藏色散人원래의
2020-08-24 10:37:493991검색

PHP zip 압축 해제 시 잘못된 문자에 대한 해결 방법: 먼저 iconv 함수를 사용하여 중국어 압축 패키지 이름을 트랜스코딩한 다음 ZipArchive 개체를 통해 zip 파일을 처리하고 마지막으로 처리된 zip 파일을 닫습니다.

PHP zip 압축 해제 시 문자가 깨지는 문제를 해결하는 방법

권장: "PHP 비디오 튜토리얼"

테스트 환경은 windows7

중국어 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

블로그를 참조하여 원래 해결 방법은 다음과 같습니다.

<?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 zip 압축 해제 시 문자가 깨지는 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.