我正在尝试使用 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 编码:)
