Linux 下 zip 文件解压乱码解决方案
2016-03-08 本文已影响1010人
西文Steven
由于zip格式中并没有指定编码格式,Windows下生成的 zip 文件中的编码是 GBK/GB2312 等,因此,导致这些 zip 文件在 Linux 下解压时出现乱码问题,因为Linux下的默认编码是 UTF8。
目前网上流传一种 unzip -O cp936 的方法,但一些 unzip 是没有 -O 这个选项的(我用的 Debian 就没有,Ubuntu 可以)。
unzip -O cp936 xxxx.zip
另外有两种解决方案可用:
第一种: 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()
Python 语言,在复制代码后务必要注意代码的对齐
Windows 用户屏蔽两条 print 语句,Linux 用户不用屏蔽(加 #
部分)
Notice:有人补充 fo = open(utf8name, "wb") 否则 jpg 啊什么统统不正确
第二种: 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表示递归访问目录,即对当前目录中所有文件进行转换。
作者:Latm Ake
链接:http://www.zhihu.com/question/20523036/answer/35225920
来源:知乎