inux下zip文件亂碼已經是一個常見問題了,再加上python想不遇到亂碼問題都難。
在zipfile.ZipFile中獲得的filename有中日文則很大可能是亂碼,這是因為
在zip標准中,對文件名的 encoding 用的不是 unicode,而可能是各種軟件根據系統的默認字符集來采用(此為猜測),而zipfile中根據文件 flag 檢測的時候,只支持 cp437 和 utf-8。
具體zipfile模塊中的源代碼如下
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后重新再手動轉為正確的編碼。具體代碼如下:
#這里是在ZipFile.infolist()方法獲得的info中取得filename
name = info.filename
try: #使用cp437對文件名進行解碼還原 name = name.encode('cp437') #win下一般使用的是gbk編碼 name = name.decode("gbk") except: #如果已被正確識別為utf8編碼時則不需再編碼 pass