#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");
Надеюсь, это поможет кому-нибудь не тратить часы на попытки выяснить кодировку конкретного заархивированного файла.