我正在使用PHP 5.3.10(Zip版本1.12.5和Libzip版本0.11.2)在 UNIX 系统上创建ZIP存档:
<?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在 Windows 7 上打开生成的ZIP文件test.zip时,我看到存档中的文件,如“Liste client +аexporter.txt”而不是“Listeclientàexporter.txt” ”。 但是如果以7z打开它,文件名是正确的,带重音。 PHP文件具有UTF-8编码。
解决 问题出在Windows 7(补丁KB2704299)
中File names are corrupted after you decompress a .zip file in Windows 7 or in Windows Server 2008 R2
答案 0 :(得分:0)
有同样的问题(我是法国人,所以我知道口音的问题)。
为避免此问题,我使用外部zip命令。
对于Linux:
exec("cd \"".$the_directory_you want_to_zip."\" && zip -0 -r \"".$path_zip."\" .");
答案 1 :(得分:0)
不确定当前Windows 10和Php7的当前状态,但以防万一Windows上的zip口音仍然存在问题。
您需要在压缩时将文件名转换为IBM850
,而在从zip提取时将其转换回UTF8, ISO-8859-1, CP1252
。
//zipping
$relativePath = iconv('UTF-8', 'IBM850', $relativePath);
$zip->addFile($filePath, $relativePath);
//extracting
$relativePath = iconv('IBM850', 'UTF-8', $zip->getNameIndex($i));
$zip->renameIndex($i, $relativePath);
$zip->extractTo($destination, $relativePath);