您的位置:首页 > 编程语言 > Python开发

python3解决解压zip文件是文件名乱码问题

2017-11-26 10:25 1476 查看
在zip标准中,对文件名的 encoding 用的不是 unicode,而可能是各种软件根据系统的默认字符集来采用(此为猜测),因此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后重新再手动转为正确的编码。具体代码如下:

#修改代码
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')
#修改
filename = filename.encode("cp437").decode('gbk')


后面一处同样如此修改

if zinfo.flag_bits & 0x800:
# UTF-8 filename
fname_str = fname.decode("utf-8")
else:
fname_str = fname.decode("cp437")
#修改
fname_str = fname_str.encode("cp437").decode('gbk')


亲测有效
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 编码 乱码 zipfile