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

Gentoo 的話也可以在重新編譯 unzip 添加 natspec 支持。


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 unar

unar your-zip


unzip -O GBK

unzip -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 unrar

unar 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類型和指令集的?

TAG:Linux | Ubuntu | 解壓 | 壓縮 | ZIP文件格式 | RAR文件格式 |