ホームページ  >  記事  >  バックエンド開発  >  PHPのzip解凍で文字化けが発生する問題を解決する方法

PHPのzip解凍で文字化けが発生する問題を解決する方法

藏色散人
藏色散人オリジナル
2020-08-24 10:37:494054ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。