## 推奨: 「php zip 解凍文字化けの解決策: まず、iconv 関数を使用して中国語の圧縮パッケージ名をトランスコードし、次に ZipArchive オブジェクトを通じて zip ファイルを処理し、最後に処理された 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['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解凍で文字化けが発生する問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。