Linux 下 zip 文件解壓亂碼如何解決


作者:Latm Ake
鏈接:https://www.zhihu.com/question/20523036/answer/35225920
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

問題

由於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表示遞歸訪問目錄,即對當前目錄中所有文件進行轉換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM