linux下zip檔案亂碼已經是乙個常見問題了,再加上python想不遇到亂碼問題都難。
在zipfile.zipfile中獲得的filename有中日文則很大可能是亂碼,這是因為
在zip標準中,對檔名的 encoding 用的不是 unicode,而可能是各種軟體根據系統的預設字符集來採用(此為猜測),而zipfile中根據檔案 flag 檢測的時候,只支援 cp437 和 utf-8。具體zipfile模組中的源**如下
if flags & 0x800:可見編碼被正確識別為utf8時的情況外,都會被識別並decode為cp437編碼,但如果實際是gbk等其他編碼時就變為亂碼了。所以解決的方法在於被decode為cp437後重新再手動轉為正確的編碼。具體**如下:# utf-8 file names extension
filename = filename.decode('utf-8')
else:
# historical zip filename encoding
filename = filename.decode('cp437')
#這裡是在zipfile.infolist()方法獲得的info中取得filenamename = 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:可見編碼被正確識別為utf8時的情況外,都會被識別並decode為cp437編碼,但如果實際是gbk等其他編碼時就變為亂碼了。所以解決的方法在於被decode為cp437後重新再手動轉為正確的編碼。具體**如下:# utf-8 file names extension
filename = filename.decode('utf-8')
else:
# historical zip filename encoding
filename = filename.decode('cp437')
#這裡是在zipfile.infolist()方法獲得的info中取得filenamename = 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...