我有以下代码
$zip = new ZipArchive;
$res = $zip->open('tmp/articles.zip');
if ($res === TRUE) {
$zip->extractTo('tmp/');
$zip->close();
}
它适用于具有英文文件名的档案,但如果我用俄语字符做成的,我有不可读的文件名。我该怎么办?
UPD:当我使用bash中的“unzip”时,它无法正常工作。
答案 0 :(得分:3)
看看这段代码:
$z = new ZipArchive();
$res = $z->open('C:\Temp\Temp.zip');
if ($res)
{
$z->extractTo('C:\Temp\Temp');
$z->close();
}
$files = scandir('C:\Temp\Temp');
foreach ($files as $filename)
{
print iconv('cp866', 'utf-8', $filename).PHP_EOL;
}
此代码打印正常的文件名 因此,WinRar使用旧的ms-dos字符集'cp866'作为西里尔字母 希望您可以更改此代码以创建重命名算法:)
答案 1 :(得分:1)
这种方法并不总是有效。我发现自己安装了一个像7zip这样的外部库来完成这项工作,它解决了这个问题。很难知道windows中用于文件的编码字符集。 在我的情况下,我必须这样做,以避免提取后文件名中的错误。 以下是我的变量:
// Extract file.
$tmp_dir = uniqid();
$zip_uri = "test.zip";
$destination_dir = "C:\\Users\\user\\AppData\\Local\\Temp\\$tmp_dir";
这是ZipArchive方法:
$zip = new ZipArchive();
$zip->open($zip_uri);
if (!$zip->extractTo($destination_dir)) {
die("Error extracting files.");
}
$zip->close();
这种方法并不总是有效,但以下工作效果很好(使用7Zip):
exec("C:\\7zip\\7za.exe e $zip_uri -o$destination_dir");
希望有人不花费数小时试图找出特定压缩文件的编码字符集。