Python3中zipfile模塊文件名亂碼問題

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
相關文章
相關標籤/搜索