提问人:samb 提问时间:3/16/2012 最后编辑:Dharmansamb 更新时间:5/1/2022 访问量:3016
ArcName 的 Python zipfile 编码
python zipfile encoding for arcname
问:
我正在尝试使用 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)交叉平台解决方案吗?
答:
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 版本。
上一个:如何通过 ssh 运行 npm
评论