1. 程式人生 > >python3解決解壓zip檔案是檔名亂碼問題

python3解決解壓zip檔案是檔名亂碼問題

在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')

親測有效