ZipArchive 使用什么编码在创建的存档中存储文件名?

问题描述 投票:0回答:4

我使用 php ZipArchive 类来生成 zip 存档。我使用 addFile 方法的第二个参数来设置存档中文件的名称(因为磁盘上的真实文件具有不同的名称)。某些名称必须包含法语口音(例如 é)。当我下载存档时,文件名中的重音符号未正确显示。文件名应该使用什么编码? (应用程序使用UTF-8)

php encoding ziparchive
4个回答
9
投票

这是 php bug #53948,请参阅官方错误报告

建议的解决方法(对我有用):

$zip->addFile($file, iconv("UTF-8", "CP852", $local_name));

4
投票

使用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))))));
}

2
投票

Zip 文件没有指定的编码;归档工具必须猜测(或假设)所使用的编码。首先尝试 CP1252,然后从那里开始。


1
投票

取决于 Windows 系统,例如法语,Windows 的内部 zip 使用

IBM850
作为编码。

© www.soinside.com 2019 - 2024. All rights reserved.