PHP ZipArchive,文件名中带有重音字符

时间:2015-04-23 09:11:59

标签: php windows-7 ziparchive non-ascii-characters

我正在使用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

2 个答案:

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