问题描述:利用python3 的zipfile模块解压zip文件包,这个文件包中有的文件名是中文,解压后这个中 文文件名显示为乱码。
问题分析:因此zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8。
具体就是查找 zipfile.py 源代码找到下面的代码:
1: if flags & 0x800:
2: # UTF-8 file names extension
3: filename = filename.decode('utf-8')
4: else:
5: # Historical ZIP filename encoding
6: filename = filename.decode('cp437')
可见编码被正确识别为utf8时的情况外,都会被识别并decode为cp437编码,但如果实际是gbk等其他编码时就变为乱码了。所以解决的方法在于被decode为cp437后重新再手动转为正确的编码。
解决方案:许多人想到修改源码文件,杀鸡还要用牛刀。其实可以不用。只需要把显示为乱码的文件名 转换成utf-8编码格式就能正确显示。
import os
import zipfile
r = zipfile.is_zipfile('test.zip')
if r:
fz = zipfile.ZipFile(zip_src, 'r')
for file in fz.namelist():
fz.extract(file)
right_file = file.encode('cp437').decode('utf-8')
os.rename(file,right_file)
网友评论