inux下zip文件乱码已是一个常见问题了,再加上python想不遇到乱码问题都难。python
在zipfile.ZipFile中得到的filename有中日文则很大多是乱码,这是由于bash
在zip标准中,对文件名的 encoding 用的不是 unicode,而多是各类软件根据系统的默认字符集来采用(此为猜想),而zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8。编码
具体zipfile模块中的源代码以下spa
if flags & 0x800: # UTF-8 file names extension filename = filename.decode('utf-8') else: # Historical ZIP filename encoding filename = filename.decode('cp437')
可见编码被正确识别为utf8时的状况外,都会被识别并decode为cp437编码,但若是实际是gbk等其余编码时就变为乱码了。因此解决的方法在于被decode为cp437后从新再手动转为正确的编码。具体代码以下:code
#这里是在ZipFile.infolist()方法得到的info中取得filename
name = info.filename
try: #使用cp437对文件名进行解码还原 name = name.encode('cp437') #win下通常使用的是gbk编码 name = name.decode("gbk") except: #若是已被正确识别为utf8编码时则不需再编码 pass