Skip to main content
 首页 » 编程设计

arcname 的 python zipfile 编码

2025年05月04日11mate10pro

我正在尝试使用 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)跨平台解决方案吗?

请您参考如下方法:

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

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