【Python】window10\Linux python unzip 中文亂碼

在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這個文件

 

至此亂碼問題解決!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章