ArcName 的 Python zipfile 编码

python zipfile encoding for arcname

提问人:samb 提问时间:3/16/2012 最后编辑:Dharmansamb 更新时间:5/1/2022 访问量:3016

问:

我正在尝试使用 Python 的 zipfile 库将多个文件添加到 zip 中。 问题出在压缩的文件名中,其中包含特殊字符 (utf-8)。

下面是一个基本代码:

#!/usr/bin/env python

import zipfile

infilename = "test_file"
outfilename = "test.zip"
filename = u'Conf\xe9d\xe9ration.txt'

if __name__ == '__main__':
    f = open(outfilename, "w")
    archive = zipfile.ZipFile(f, "w", zipfile.ZIP_DEFLATED)
    archive.write(infilename, filename.encode("CP437"))
    archive.close()
    f.close()

生成的文件未使用每个zip提取器正确读取:

  • Ubuntu 10.04 和 11.10:无法提取 Conf?d?ration.txt
    文件:“警告:文件名不匹配:Conf?d?ration.txt”

  • Windows XP 和 7 : 可以读取 Confédération .txt
    文件

  • MacOSX (Lion) : 可以读取 ConfÇdÇration.txt
    文件

我尝试不编码到 CP437,只将一行更改为:

    archive.write(infilename, filename)

这次Ubuntu仍然有同样的问题,Windows给出了“Conf + d + ®®ration.txt”,MacOSX可以完美运行。

有人知道(pythonic)交叉平台解决方案吗?

python 字符编码 zip python-zipfile

评论


答:

1赞 Nickolay Olshevsky 12/10/2012 #1

看起来文件名是“按原样”编写的(即第一次以 CP437 编码编写,第二次以 UTF8 编写),而其他存档处理程序使用不同的方法:

  • Windows:它使用DOS / OEM编码作为存档中的文件名,这就是CP437工作的原因。并且,PKWare 标准中描述了此行为;
  • Mac OS :它静默地使用 utf-8,这违反了标准。这就是 utf8 在 Mac OS 中工作的原因。
  • Linux/Unix:他们使用系统代码页作为存档中的文件名,不知道您的 Linux 安装配置到哪个,但不适用于 DOS,也不用于 UTF8 编码:)

评论

0赞 beruic 5/8/2018
Linux zip afaik 还会在文件列表中保存 UTF-8 版本。