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

发布于 2024-10-17 18:40:15 字数 159 浏览 3 评论 0原文

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

I'm using the php ZipArchive class in order to generate a zip archive. I use the second parameter of the addFile method in order to set the name of the file in the archive (since the real file on disk has a different name). Some of the names must contain french accents (such as é). When I download the archive, the accents aren't correctly displayed in the file name. What encoding should I use for the file names ? (the application uses UTF-8)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

怎言笑 2024-10-24 18:40:15

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

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

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

It is php bug #53948, see official bug report.

Suggested workaround (worked for me):

$zip->addFile($file, iconv("UTF-8", "CP852", $local_name));
转瞬即逝 2024-10-24 18:40:15

使用DOS编码。我的文件名包含西里尔字符,因此在将文件名传递给 $zip 后,我将文件名从 cp1251 (Windows) 编码为 cp866 (DOS) ->addFile()。

编辑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))))));
}

Use DOS encoding. My file names has cyrillic characters, so I'm encoding the file names from cp1251 (Windows) to cp866 (DOS), upon passing the filename to $zip->addFile().

EDIT 2024-02-20: here is what I'm doing to convert UTF-8 that contain Cyrillic characters into DOS chartable on Linux.

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))))));
}
流云如水 2024-10-24 18:40:15

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

Zip files don't have a specified encoding; the archive tool must guess (or assume) the encoding used. Try CP1252 first, then go from there.

独自←快乐 2024-10-24 18:40:15

取决于Windows系统,例如法语,Windows内部zip使用IBM850作为编码。

Depends on the Windows system e.g French, internal zip of Windows use IBM850 as encoding.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文