请注意,ZIP 存档不支持 UTF-8 等 Unicode 编码,因此多字节字符无法在标准 ZIP 查看器(如 WinRAR 或 7-zip)中显示。但是,文本将按原样存储,因此至少可以在您自己的桌面或 Web 应用程序中显示 UTF-8 注释。如果您想使用 PHP 进行测试并在浏览器中输出,请不要忘记将页面字符集也设置为 UTF-8
header("Content-Type: text/plain; charset=utf-8");
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.4.0)
ZipArchive::setArchiveComment — 设置 ZIP 存档的注释
comment
注释的内容。
示例 #1 创建存档并设置注释
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->setArchiveComment('new archive comment');
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
?>
请注意,ZIP 存档不支持 UTF-8 等 Unicode 编码,因此多字节字符无法在标准 ZIP 查看器(如 WinRAR 或 7-zip)中显示。但是,文本将按原样存储,因此至少可以在您自己的桌面或 Web 应用程序中显示 UTF-8 注释。如果您想使用 PHP 进行测试并在浏览器中输出,请不要忘记将页面字符集也设置为 UTF-8
header("Content-Type: text/plain; charset=utf-8");
ZIP 存档在存储时以 ISO-8859-1 编码,但注释似乎始终以 UTF-8 编码添加。所以...
<?php
$zip->setArchiveComment("Peña"); // 输出 "Peña" 作为注释。
$zip->setArchiveComment("Peña"); // 输出 "NULL" 作为注释 / 没有显示注释。
?>
使用 mb_internal_encoding() 或 mb_http_output() 不会改变这种行为。
最后,您可以使用类似 str_replace() 的方法修复损坏的注释。
考虑这一点
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->setArchiveComment('Peña'); // 输出 "Peña" 作为注释。
$zip->close();
$file = file_get_contents('test.zip');
file_put_contents('test.zip', str_replace("Peña", utf8_decode("Peña"), $file)); // 输出 "Peña" 作为注释。已修复!
echo 'ok';
} else {
echo 'failed';
}
?>
ZipArchive(使用 libzip)以 UTF-8/ASCII 编码注释,但 Windows 上的一些软件以 ANSI(如 GBK ...)显示注释,因此我们应该
<?php
$_charset = 'GBK';
$file = 'D:/boaphp.zip';
$comment = '中文ABC123';
$zip = new ZipArchive;
$res = $zip->open($file, ZipArchive::CREATE);
if ($res) {
// 在此处添加文件
if($_charset){ // 针对 Winrar、7z ...
$zip->close();
$str = mb_convert_encoding($comment, $_charset, 'UTF-8');
$fh = fopen($file, 'r+b');
fseek($fh, -2, SEEK_END);
$str = pack('v', strlen($str)) . $str;
fwrite($fh, $str);
fclose($fh);
}else{ // 针对 PHP: $zip->getArchiveComment()
$zip->setArchiveComment($comment);
$zip->close();
}
}
?>