如何解码Windows 10生成的压缩包中的乱码文件名?
解决Windows生成Zip包文件名乱码问题
问题根源
Windows系统默认生成Zip包时,文件名使用系统本地编码(中文环境为GBK,英文环境为CP1252),而Python的zipfile模块默认采用IBM437编码解码文件名,两者不匹配就会出现乱码。Ubuntu生成的Zip包默认使用UTF-8编码,所以不会有问题;无法本地复现是因为你的本地环境编码和客户端Windows环境不一致。
解决方案
修改代码逻辑:先将namelist()返回的乱码字符串重新编码为IBM437(还原Zip包中存储的原始字节),再尝试用Windows常用编码(GBK/CP1252)解码,最后保留原逻辑作为 fallback。
修改后的代码:
from zipfile import ZipFile with ZipFile('arhive.zip') as myzip: for name in myzip.namelist(): raw_bytes = name.encode("IBM437") uname = name # 优先尝试中文Windows环境的GBK编码 try: uname = raw_bytes.decode("GBK") except UnicodeDecodeError: # 尝试英文Windows环境的CP1252编码 try: uname = raw_bytes.decode("CP1252") except UnicodeDecodeError: # 最后尝试俄语环境常用的IBM866编码 try: uname = raw_bytes.decode("IBM866") except UnicodeDecodeError: pass print(uname)
额外建议
如果客户端可以更换Zip生成工具,推荐使用支持UTF-8编码的工具(比如7-Zip,勾选"使用UTF-8编码文件名"选项),这样zipfile会自动识别UTF-8编码,无需额外处理。
内容的提问来源于stack exchange,提问作者Jon Jones
相关产品推荐
相关产品推荐

