收到一个压缩包,用 unzip 解压,发现原来的中文文件名全是乱码。
查找解决办法,发现网络上有不止一个人提到可以给 unzip
命令指定 -O CP936
选项来纠正这一问题,但实测无果,也许是我 Debian 下没有支持 936 代码页需要的文件或者库?看起来并不像,因为连有人说的 unzip --help
输出信息中对此参数有一点说明的痕迹也没发现。还有人说可以设定环境变量云云,一看也是此方法的变种,不足采用。
有人提示可以使用 unar
命令,于是熟练地 apt 安装之,是好使的。看安装时的依赖组件,这个工具倒像是 Objective-C 写的。
后来想到如果只是文件名的编码问题的话,应该可以在处理每个文件的时候想办法纠正过来,开始还想是不是有 shell 脚本可以,后来找到一份 python 代码(参见 https://blog.csdn.net/gatieme/article/details/44807105,其中还有可以更改源码自己编译的部分,也可以参看 https://www.cnblogs.com/JesseTsou/p/10488435.html,未予实践),也就认了,略作修订如下,实测管用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # uzip.py import os import sys import zipfile print "File " + sys.argv[1] + " unzipping..." 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() print "File " + sys.argv[1] + " unzipped." |
永久链接
补充说明一下。在 Debian 10.x 系统下,unzip 确实没有 -O 这个选项,但是,在 Ubuntu 18.04 LTS 下的时候,unzip 的帮助信息里是有这个选项的说明的,显然,Ubuntu 发版时合并了对代码页的支持补丁。