Python3中zipfile模組檔名亂碼問題

2022-07-02 11:30:18 字數 1909 閱讀 5986

linux下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

#如果是utf-8文字被別的編碼方式編碼會出現錯誤,因此不會執行try部分的**

try:

#亂碼是由cp437解碼而來,將這些亂碼還原為位元流

name = name.encode('cp437')

#win下一般使用的是gbk編碼;將這些位元流按gbk規則解碼

name = name.decode("gbk")

except:

#如果已被正確識別為utf8編碼時則不需再編碼

pass

linux下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

#如果是utf-8文字被別的編碼方式編碼會出現錯誤,因此不會執行try部分的**

try:

#亂碼是由cp437解碼而來,將這些亂碼還原為位元流

name = name.encode('cp437')

#win下一般使用的是gbk編碼;將這些位元流按gbk規則解碼

name = name.decode("gbk")

except:

#如果已被正確識別為utf8編碼時則不需再編碼

pass

python3中異常處理 Python3異常處理

python的異常處理機制 使用 try.except 捕獲異常 try 業務實現 except error1,error2,as e 出現異常後的處理 異常類的繼承關係 baseexception systemexit keyboardinterrupt generatorexit excepti...

python3怎麼賦值 python3中賦值問題?

我閒著沒事乾來詳細回答一波。phthon的物件實際儲存在記憶體上,而變數名對應了乙個位址,位址指向了那一塊記憶體。在第一例中,python在記憶體中開出了一片用來儲存int值1,然後將它的位址賦值給a,接下來a把位址賦值給b。此時a,b指向同乙個int值物件。後來b 1的操作做的是先計算b 1,計算...

python3中文長度 python3獲得漢字長度

import string def str count str 找出字串中的中英文 空格 數字 標點符號個數 count en count dg count sp count zh count pu 0 for s in str 英文 if s in string.ascii letters cou...