在zip標準中,對檔名的 encoding 用的不是 unicode,而可能是各種軟體根據系統的預設字符集來採用(此為猜測),因此zipfile中根據檔案 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等其他編碼時就變為亂碼了。所以解決的方法在於被decode為cp437後重新再手動轉為正確的編碼。
具體**如下:
#修改**
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'
)後面一處同樣如此修改
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'
)
unzip解壓中文亂碼 氷泠的部落格
1 問題描述 直接unzip zip亂碼,肯定是編碼問題了不用問。但是unzip沒有指定編碼的選項 網上的解決方案如下 unzip o gbk gb18030cp936 xx.zip但是沒有 o選項啊。2 解決辦法 解決辦法是安裝unzip iconv,筆者系統為manjaro,直接安裝會提示會與u...
Ubuntu 使用unzip解壓亂碼的問題
由於win使用的是gbk編碼,在win下打包zip的壓縮檔案在ubuntu下使用unzip解壓會出現亂碼的問題。解決方案 換軟體,不用unzip,使用unar 18.04是預設安裝的,如果沒有預設安裝可以使用 sudo apt get install unar 這個命令安裝。1.列出壓縮包的內容 l...
Linux下使用unzip解壓縮中文亂碼問題
我的linux 裝了 unzip。沒有裝就執行 yum install unzip 即可 原因是unzip試圖將zip檔案中用 oem ibm dos codepage 編碼的檔名轉換成自己的內部編碼。可惜unzip只能轉換極少數幾種codepage,中文的 cp936 不在其列。方法一 unzip...