在zip這個包中,對文件名的 encoding 用的不是 unicode,查看源碼後,zipfile中根據文件 flag 檢測的時候,只支持 cp437 和 utf-8。具體就是查找 zipfile.py 源代碼找到下面的代碼:
第一處:
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')
第二處:
if zinfo.flag_bits & 0x800:
# UTF-8 filename
fname_str = fname.decode("utf-8")
else:
fname_str = fname.decode("cp437")
從源碼可以看出:可見編碼被正確識別爲utf8時的情況外,都會被識別並decode爲cp437編碼,但如果實際解壓的文件是gbk等其他編碼時就變爲亂碼了。所以解決的方法decode爲gbk。具體代碼如下:
第一處:
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
# update ryanzheng
# #filename = filename.decode('cp437')
filename = filename.decode('gbk')
# update ryanzheng
第二處:
if zinfo.flag_bits & 0x800:
# UTF-8 filename
fname_str = fname.decode("utf-8")
else:
# update ryanzheng
# fname_str = fname.decode("cp437")
fname_str = fname.decode('gbk')
# update ryanzheng
經過上修改後。將修改後的zipfile.py文件覆蓋掉C:\ProgramData\Anaconda3\Lib\【每個人的不一樣。就是將你所運行的python環境下的文件替換;在cmd中可執行命令:where python】目錄下的zipfile.py
Linux上面的處理:同樣是將修改後的zipfile.py文件覆蓋掉/usr/local/anaconda3/lib/python3.7/【每個人的不一樣。就是將你所運行的python環境下的文件替換;命令行中輸入:whereis python】目錄下的zipfile.py
tips:cd到/usr/local/anaconda3/目錄下。然後使用命令:find ./ -name zipfile.py
總結:
1、python運行環境需要安裝了zip這個包
2、修改zipfile.py這個文件的兩處代碼
3、覆蓋原來的zipfile.py這個文件
至此亂碼問題解決!!!