PHP + ZipArchive +俄语

时间:2011-05-28 17:17:47

标签: php zip unzip

我有以下代码

  $zip = new ZipArchive;
  $res = $zip->open('tmp/articles.zip');
  if ($res === TRUE) {
    $zip->extractTo('tmp/');
    $zip->close();
  }

它适用于具有英文文件名的档案,但如果我用俄语字符做成的,我有不可读的文件名。我该怎么办?

UPD:当我使用bash中的“unzip”时,它无法正常工作。

2 个答案:

答案 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");

希望有人不花费数小时试图找出特定压缩文件的编码字符集。