3
25
2010
22

Linux 下 zip 文件名乱码解决

本文来自依云's Blog,转载请注明。

今天同学向QQ群邮箱里上传文件用了 zip 格式。于是乱码问题再次摆在了面前。

rar 格式和 7z 格式是我所仅知道的两种支持 UTF-8 格式的压缩文件格式。本来平时大家都喜欢用 rar 格式的,不知道为什么这次得到课件的同学却使用了 zip 格式。以前 zip 是支持指定编码解压的,但不知什么时候升级了后就没有这个选项了。于是尝试使用我曾经写过的gbkunzip这个 Python 脚本来解压,却出错了,说不能用 latin1 解码某个字符。

晕啊!当初只为了一时之需没好好写,当时测试成功了现在却不行了。尝试着改了几下,无果,于是去看zipfile的代码,才知道转码时应该用cp437编码来着。改正后,在为文件更名时另一个错误跳出来:OSError!查了 Python 手册,应该os.rename()不支持对目录更名。

真是麻烦啊。本来我是把文件解压出来再改名来着。现在我有点烦了,决定从源头入手,把zipfile拿来自己修改,把所有的 utf8 都改成了 gb18030,然后解压那个文件,成功!当初写那个脚本时我怎么没想到这样做呢?

不过,这次解压是成功,还不知道以后会不会再出什么问题。以后遇到问题再完善吧。

2013年5月21日更新:添加对加密 zip 文档的支持。


脚本在此。Arch Linux 用户可从 AUR 安装。

Category: Linux | Tags: linux 乱码 zip | Read Count: 29933
荒野无灯 说:
Apr 18, 2010 09:34:17 PM

嗯,遇到过这个情况。在WIN下直接用RAR解压出来的都是乱码文件名。

Avatar_small
依云 说:
Apr 18, 2010 09:48:15 PM

@荒野无灯: 哇,我的博客终于迎来了第一条留言,没想到竟然是你呵。

podjons 说:
Oct 06, 2010 11:12:00 AM

百合,我google,linux zip乱码,不小心就进来了

podjons 说:
Oct 06, 2010 12:00:52 PM

./gbkunzip CentOS5.zip
Traceback (most recent call last):
File "./gbkunzip", line 37, in <module>
z.run()
File "./gbkunzip", line 30, in run
self.getNames()
File "./gbkunzip", line 17, in getNames
self.utf8Names = [x.encode('latin1').decode('gb18030') for x in self.gbkNames]
File "./gbkunzip", line 17, in <listcomp>
self.utf8Names = [x.encode('latin1').decode('gb18030') for x in self.gbkNames]
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
////////////////////////////////
python3 不行,python2,也不行,还不更新?
unzip -v
UnZip 6.00 of 20 April 2009, by Info-ZIP

哎,重启换windows解压去

Avatar_small
依云 说:
Oct 07, 2010 02:19:00 AM

你好像用的是论坛上旧的gbkunzip。请阅读本文第二段并从文末链接下载新版程序。

o(∩∩)o...哈哈 说:
Mar 12, 2011 01:18:29 PM

我一直7z x filename.zip 好像从来没遇到过乱码的情况。。。

Fermat 说:
Mar 22, 2011 09:14:58 PM

我也是你这么干的,难以遇到乱码。

osily 说:
May 30, 2011 09:30:30 AM

这个有不少解决方法:
可以用7z解完再用convmv:
#!/bin/bash
mkdir $1.
cd $1.
LANG=C
7z x ../$1
convmv -f gbk -t utf8 --notest -r .
还可以解完后用convmvfs再copy出来:
vmvfs () {
uri=`pwd`
echo $uri | grep '.avfs' &> /dev/null && cd
convmvfs /mnt/fuse -o srcdir=$uri,icharset=gbk
cd /mnt/fuse/
}

Avatar_small
依云 说:
May 30, 2011 12:14:33 PM

还有 convmvfs 啊。comvmv 我以前也用过,有次没改对,反而是再也改不回去了。很郁闷,所以一直就没再用它了。

o(∩∩)o...哈哈 说:
Jun 08, 2011 04:28:10 PM

unzip -O CP936 xxx.zip (用GBK, GB18030也可以)
一行命令就搞定了 ,keep it simple,stuipd!!

Avatar_small
依云 说:
Jun 08, 2011 06:23:41 PM

不看文章就评论的孩子。。。

flay 说:
Aug 10, 2011 12:31:50 PM

嗯,刚测试,很好用。

Shadow 说:
Sep 26, 2011 02:57:47 AM

不错,测试成功。。感谢博主

大茶几 说:
Oct 06, 2011 10:42:39 PM

更换gbk为其他编码就可以解压其他编码的文件?

叶剑飞 说:
Mar 20, 2012 09:24:53 PM

这个功能早就没了!crying

-O 的参数早就取消了

Joker_Qyou 说:
May 21, 2013 01:17:04 PM

博主可以进一步改进,比如,现在这个脚本无法处理加密的 zip 归档文件。

farseerfc 说:
Dec 14, 2013 08:35:38 PM

unzip的-O參數在aur/unzip-iconv這個包裏

yinflying 说:
May 11, 2017 10:02:31 PM

前一段时间发现升级后的unzip不支持-O选项了,也觉得很郁闷,现在我解压全用unar这个程序,全面解决了乱码,而且几乎支持所有压缩格式,所以来安利一下。

ps: 顺便让您回顾一下七年前的兴奋。

Avatar_small
依云 说:
May 12, 2017 10:15:59 AM

好像很早之前就不支持 -O 了的呀。
unar 这个是 objc 写的啊……和 7z 相比有什么优点呢?

七年了呢,时间过得真快啊。

yinflying 说:
May 12, 2017 03:21:20 PM

全能解压吧,几乎支持所有压缩格式,省得记那么多解压方法了。

Avatar_small
依云 说:
May 12, 2017 05:04:35 PM

7z 也支持一大堆格式呀。不过有些细节它不支持(比如权限、扩展属性),或者不知道怎么用。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com