zip 格式本身没有存储压缩包文件名编码信息。
Windows 下程序生成的 zip 压缩包里文件编码默认是本地代码页对应的字符编码,对于 CP936 代码页,即为 GBK。而 Linux 下处理 zip 文件默认使用 UTF-8。
Linux 下解压不同文件名编码 zip
Python
简易 DIY。
#!/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()
7z 配合 convmv
apt-get install p7zip convmv
# LANG=C以US-ASCII这样的编码输出文件名,如果没有这个语言设置,它同样会输出乱码,只不过是UTF8格式的乱码(convmv会忽略这样的乱码)。
LANG=C 7z x your-zip-file.zip
# 将GBK编码的文件名转化为UTF8编码,-r 递归访问子目录。
convmv -f GBK -t utf8 --notest -r .
Unzip -O
unzip -O cp936 file.zip
要求 unzip 支持 -O 参数。(检测方法: unzip --help 查看是否有 -O charset 参数说明)
Windows 下解压不同文件名编码 zip
推荐 Bandizip 这个免费软件,可以直接选择 zip 文件的文件名编码。