Я создаю ZIP архив на UNIX система, использующая PHP 5.3.10 с версией Zip 1.12.5 и версией Libzip 0.11.2:
<?php
$zip = new ZipArchive();
$test_zip = "./test.zip";
if ($zip->open($test_zip, ZIPARCHIVE::CREATE)===TRUE)
{
$zip->addFromString("Liste client à exporter.txt","Content line 1\nContent line 2\n");
$zip->close();
if(file_exists($test_zip))
{
header ("Content-Type: application/octet-stream");
header ("Accept-Ranges: bytes");
header ("Content-Length: ".filesize($test_zip));
header ("Content-Disposition: attachment; filename=\"test.zip\"");
header ("Cache-Control: max-age=60");
readfile($test_zip);
unlink ($test_zip);
}
}
?>
Когда я открываю сгенерированный ZIP-файл test.zip на Windows 7 используя внутренний ZIP, я вижу файл в архиве как «клиент Liste + файл exporter.txt» вместо «клиент Liste à exporter.txt».
Но если открыть его, например, с помощью 7z, имя файла будет правильным, с ударением.
Файл PHP имеет кодировку UTF-8.
РЕШИТЬ
Проблема была в Windows 7 (патч KB2704299)
Имена файлов повреждаются после распаковки ZIP-файла в Windows 7 или Windows Server 2008 R2
Была та же проблема (я француз, так что проблема с акцентом я знаю).
Чтобы избежать этой проблемы, я использую внешнюю команду zip.
Для Linux:
exec("cd \"".$the_directory_you want_to_zip."\" && zip -0 -r \"".$path_zip."\" .");
Других решений пока нет …