PHP ZipArchive русский язык

#php #zip #unzip

#php #zip #распаковать

Вопрос:

у меня есть следующий код

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

Это отлично работает для архивов с английскими именами файлов, но если я создал архив с русскими символами, у меня получаются нечитаемые имена файлов. Что мне делать?

UPD: Это тоже работает некорректно, когда я использую «unzip» из bash.

Комментарии:

1. @Ximik: На какой ОС и какая целевая ОС?

2. В Windows XP. Целевой операционной системой является Debian. Но та же проблема и в моем archlinux.

3. @Ximik: Так это NTFS / FAT32 / FAT16 / … в ext3 / ext2 / …?

4. проблема @Gumbo не в файловой системе, такое же поведение в Win7 / Win7 (исходный / целевой).

5. @OZ_: Тогда, может быть, это WinRAR. Вы пробовали другое программное обеспечение?

Ответ №1:

Посмотрите на этот код:

 $z = new ZipArchive();
$res = $z->open('C:TempTemp.zip');
if ($res)
{
    $z->extractTo('C:TempTemp');
    $z->close();
}

$files = scandir('C:TempTemp');
foreach ($files as $filename)
{
    print iconv('cp866', 'utf-8', $filename).PHP_EOL;
}
  

Этот код выводит обычные имена файлов.
Итак, WinRAR использует старую кодировку ms-dos ‘cp866’ для кириллицы.
Надеюсь, вы сможете изменить этот код, чтобы создать алгоритм переименования 🙂

Ответ №2:

Этот метод не всегда работает. Я обнаружил, что устанавливаю внешнюю библиотеку, такую как 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");
  

Надеюсь, это поможет кому-нибудь не тратить часы на попытки выяснить кодировку конкретного заархивированного файла.