在zip標準中,對文件名的 encoding 用的不是 unicode,而可能是各種軟件根據(jù)系統(tǒng)的默認字符集來采用(此為猜測),因此zipfile中根據(jù)文件 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等其他編碼時就變?yōu)?a href="/article/88040.html">亂碼了。所以解決的方法在于被decode為cp437后重新再手動轉(zhuǎn)為正確的編碼。
具體代碼如下:
1
2
3
4
5
6
7
8
9
|
#修改代碼 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') |
后面一處同樣如此修改
1
2
3
4
5
6
7
|
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') |
親測有效!
以上這篇解決python3中解壓zip文件是文件名亂碼的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/tian544556/article/details/78635840