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