我使用 php ZipArchive 类来生成 zip 存档。我使用 addFile 方法的第二个参数来设置存档中文件的名称(因为磁盘上的真实文件具有不同的名称)。某些名称必须包含法语口音(例如 é)。当我下载存档时,文件名中的重音符号未正确显示。文件名应该使用什么编码? (应用程序使用UTF-8)
这是 php bug #53948,请参阅官方错误报告。
建议的解决方法(对我有用):
$zip->addFile($file, iconv("UTF-8", "CP852", $local_name));
使用DOS编码。我的文件名包含西里尔字符,因此在将文件名传递给
cp1251
后,我将文件名从 cp866
(Windows) 编码为 $zip->addFile()
(DOS)。
编辑2024-02-20:这是我正在做的将包含西里尔字符的UTF-8转换为Linux上的DOS图表的操作。
function utf8cp866($t) {
if (stristr(PHP_OS, 'WIN')) return $t; // don't need to convert it on Windows.
// fixing for Ukrainian "Ii" and quotes.
return iconv('utf-8', 'cp866',
str_replace('і', 'i', // Ukrainian i to latin. They look identically in unicode, but different characters. DOS cp866 table duesn’t support this character.
str_replace('І', 'I',
str_replace('"', '', // quotes can’t be unzipped with correct path :(
str_replace('«', '', // these characters are not exist in DOS table
str_replace('»', '',
$t))))));
}
Zip 文件没有指定的编码;归档工具必须猜测(或假设)所使用的编码。首先尝试 CP1252,然后从那里开始。
取决于 Windows 系统,例如法语,Windows 的内部 zip 使用
IBM850
作为编码。