Linux 下 zip 文件解壓亂碼如何解決?
我在ubuntu 10.04下使用unzip,7z,7za都無法正常解壓來自windows的文件。帶有中文名稱的文件夾仍然亂碼,請問有什麼解決辦法
由於zip格式中並沒有指定編碼格式,Windows下生成的zip文件中的編碼是GBK/GB2312等,因此,導致這些zip文件在Linux下解壓時出現亂碼問題,因為Linux下的默認編碼是UTF8。
目前網上流傳一種unzip -O cp936的方法,但一些unzip是沒有-O這個選項的。
我使用的版本 unzip 6.0 debian modified 版本有這個選項
我發現另外兩種解決方案可用。
python方案
此方案目前來看非常完美。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import zipfile
#print "Processing File " + sys.argv[1]
file=zipfile.ZipFile(sys.argv[1],"r");
for name in file.namelist():
utf8name=name.decode("gbk")
# print "Extracting " + utf8name
pathname = os.path.dirname(utf8name)
if not os.path.exists(pathname) and pathname!= "":
os.makedirs(pathname)
data = file.read(name)
if not os.path.exists(utf8name):
fo = open(utf8name, "w")
fo.write(data)
fo.close
file.close()
Windows 用戶屏蔽兩條 print 語句,Linux 用戶不用屏蔽
7z方案
需要安裝p7zip和convmv,在Fedora下的命令是
su -c "yum install p7zip convmv"
在ubuntu下的安裝命令是
sudo apt-get install p7zip convmv
安裝完之後,就可以用7za和convmv兩個命令完成解壓縮任務。
LANG=C 7za x your-zip-file.zip
convmv -f GBK -t utf8 --notest -r .
第一條命令用於解壓縮,而LANG=C表示以US-ASCII這樣的編碼輸出文件名,如果沒有這個語言設置,它同樣會輸出亂碼,只不過是UTF8格式的亂碼(convmv會忽略這樣的亂碼)。
第二條命令是將GBK編碼的文件名轉化為UTF8編碼,-r表示遞歸訪問目錄,即對當前目錄中所有文件進行轉換。
1.4 給unzip打補丁
根據 GitHub - ikohara/dpkg-unzip-iconv: Makefile for Debian unzip package with iconv 上的安裝步驟,給unzip打補丁,然後就可以用-O參數了
1.5 unar方法這個最簡單省力,默認debian已經安裝了額unar,這個工具會自動檢測文件的編碼,也可以通過-e來指定:
unar file.zip
即可解壓出中文文件。
來源:
Linux文件亂碼
Arch Linux 下可以直接安裝 AUR 裡面的 unzip-natspec 。接下來只要像普通文件一樣解壓縮就可以了。關鍵是 libnatspec 能自動識別編碼。
unzip test.zip
unzip -O cp936 就可以了,
但是,有些發行版所帶的 unzip 沒有這個參數,比如 ArchLinux 就需要安裝 unzip-iconv。
Ubuntu 12.04 裡面的 unzip 是有這個參數的。1樓基本已經說的很清楚了,本質問題還是zip格式的缺陷,沒有欄位標誌出文件名的編碼格式。
ZIP在壓縮與解壓縮的時候默認使用了系統的本地編碼,如windows中文環境下為GBK,日文環境下是JIS,linux默認編碼為UTF8等;那麼在不同系統環境下,只要壓縮與解壓縮的編碼不一致,就會出現亂碼。一樓提供的python解決方案,最好不要用,簡單的處理會有很多風險,比如zip炸彈,目錄覆蓋,執行病毒文件等。
正確的做法是:儘可能的只使用英文名,儘可能的使用7z格式(rar也可以,不過是商業軟體,不推薦)
解決現有的問題的話,比較靠譜的是先解壓再轉換,比如windows中文環境下的壓縮文件到linux下解壓,出現亂碼的文件名即是 GBK被當做UTF8顯示了,我們只要正確轉換就行了convmv -f gb2312 -t utf8 -r --notest *=============說句題外話,當年做的病毒木馬檢測項目,要對所有壓縮文件解壓縮,由於性能要求和介面原因,不能使用現有的解壓縮產品,最後把相關解壓縮的源代碼都看了遍,zip,rar,7z,cab,tar,gz,ios等等,其中被zip格式的亂碼問題折騰的死去活來;一怒之下把字元編碼研究了透,還寫了一篇博客,郵件亂碼、資料庫亂碼、python程序亂碼等,自此媽媽再也不擔心我的編碼問題了。也建議大家深入了解下字元編碼。文件編碼問題,您在Windows下的編碼多為gbk,gb2312,而在Linux下多為UTF-8
所以您要轉碼,而轉碼分為對文件名的轉碼和文件內容的轉碼。
文件名的轉碼用:convmv
嘗試用如下命令:convmv -f gbk -t utf8 --notest --nosmart ,如果不好用,自己man一下吧。文件內容轉碼:iconv
類似,自己處理吧。sudo apt install unarunar your-zip
unzip -O GBKunzip -O GB18030參數不存在請升級
我最近也遇到了, 百度盤下載多個文件時它自動生成的zip, 在Debian下亂碼, 各種方法都試了一下, 寫個評價:
直接用unar, 這個看起來挺美的, 自動識別, 也能手動, 但是解壓百度盤生成的zip結果是報checksum error.
先原樣解壓再convmv, 我覺得這個方案太丑, 把錯誤的文件名寫到文件系統里, 我覺得這很危險, 不過先用LANG=C 7z l a.zip | iconv -f cp936 -t utf8來看一下還是有點意義, 順便一提unzip -l不行, iconv報錯, 應該是unzip輸出的已經不是原GBK串, mangle過了, LANG=C unzip -l -UU都不行, bsdtar據說能保持但是跟unar一樣會checksum error.
unzip-iconv, 唯一不方便是debian沒有帶得自己編譯.
還有stackoverflow/superuser上有人答的7z -scs=/-mcp=, 這種回答就純瞎扯了, 這是生成時候用的, 解壓時候無效.
中間遇到個有趣的小插曲, 我還試了rar, 用的官網命令行版, 結果它根本不支持zip, 但是因為我從百度盤下的是一些小rar文件, 百度盤給打包時候用的是只打包不壓縮, 於是rar直接把裡面第一個rar文件解壓出來了...
linux解壓unzip中文亂碼的解決辦法_Linux命令
已經解決,可以通過解壓後使用convmv來解決文件名亂碼問題,通過iconv來解決文件內容的亂碼問題
sudo apt-get install unrarunar xxx.zip
我之前也遇到過這個問題,後來用的解決辦法是把rar卸載 ,裝unrar ,解壓的亂碼問題就解決了
libarchive也支持zip格式
Ubuntu下安裝bsdtar,ArchLinux安裝libarchive
bsdtar xvf archive.zip
7zip是一款開源的解壓縮軟體,不僅自己獨有的7z格式,而且支持zip,rar,tar,gzip等眾多其他格式,同時7z格式的壓縮比例很
高,目前很多硬碟版的遊戲都採用zip進行打包。下面介紹一下如何在CentOS/Debian/Ubuntu Linux上安裝7zip。
CentOS安裝7zip:
目前yum源上好像還沒有7zip,我們可以到http://dag.wieers.com/rpm/packages/p7zip/下載rpm包安裝。
32位CentOS執行下面命令:
wget -c http://packages.sw.be/p7zip/p7zip-9.13-1.el5.rf.i386.rpm
wget -c http://packages.sw.be/p7zip/p7zip-plugins-9.13-1.el5.rf.i386.rpm
rpm -ivh p7zip-9.13-1.el5.rf.i386.rpm
rpm -ivh p7zip-plugins-9.13-1.el5.rf.i386.rpm
64位CentOS下面命令:
wget -c http://packages.sw.be/p7zip/p7zip-9.13-1.el5.rf.x86_64.rpm
wget -c http://packages.sw.be/p7zip/p7zip-plugins-9.13-1.el5.rf.x86_64.rpm
rpm -ivh p7zip-9.13-1.el5.rf.x86_64.rpm
rpm -ivh p7zip-plugins-9.13-1.el5.rf.x86_64.rpm
Debian安裝7zip:
apt-get install p7zip-full
7zip命令使用方法:
7zip命令有7z和7za,7za是精簡版部分格式不支持,7z是全功能版的,建議使用7z。
7z {a|d|l|e|u|x} 壓縮包文件名 {文件列表或目錄,可選}
a 向壓縮包里添加文件或創建壓縮包,如向deepvps.7z添加deepvps001.jpg,執行:7z a deepvps.7z deepvps001.jpg;將deepvps目錄打包執行:7z a deepvps.7z deepvps;
d 從壓縮里刪除文件,如將deepvps.7z里的test.jpg刪除,執行:7z d deepvps.7z test.jpg
l 列出壓縮包里的文件,如列出deepvps.7z里的文件,執行:7z l deepvps.7z
e 解壓到當前目錄,目錄結構會被破壞,如deepvps.rar內有如下目錄及文件123/456/789.html,執行:7z e deepvps.rar,目錄123和456及文件789.html都會存放在當前目錄下。
x 以完整路徑解壓。
zip文件解壓中文文件亂碼問題
由於zip文件中沒有聲明其編碼,所以在Linux上使用unzip解壓以默認編碼解壓,中文文件名會出現亂碼。
使用7z解壓即可解決:7z x deepvps.zip
也可以使用:jar xvf deepvps.zip
說句實話,其他方法都是辣雞,請看最簡單的大招!!!
unar方法
這個最簡單省力!!!!
安裝解壓
sudo apt-get install unar
unar file.rar
即可解壓出中文文件。
詳細請看 unar萬能linux解壓工具 - CSDN博客
提供一個通過Sublime Text 文本編輯器完成的非技術友好方法
需要通過 Package Control 安裝兩個包:Codecs33 + GBK Support,
重新打開目標文本,就不是亂碼了。
然後可以選擇 "Save with Encoding &> " 保存成希望的編碼。
wine個windows下的7zip,用它來解壓
推薦閱讀:
※應用程序編譯後 只能在兼容該編譯器的平台上運行 , 為什麼 windows/linux 程序可以在多個系統版本間運行?
※gcc局部變數不用初始化么?
※對於同樣的 C 語言代碼,為什麼 Mac OS X 上用 gcc 編譯運行的結果和其他系統不同?
※GCC的參數-march=native是如何獲取cpu類型和指令集的?