原因
在zipfile.py代码中line:1126处
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后重新再手动转为正确的编码。
fn.encode('cp437').decode('gbk')