.zip/Filenames encoding

.zip/Filenames encoding

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 文件的文件名编码。


Last update: 2019-03-27 04:03:48 UTC | Redirect from Linux/Administration/zip 文件编码