Linux下使用unzip解压缩中文乱码问题

简介:

问题提出


使用info-zip.org 的 unzip类 解压zip压缩包,如果压缩包中有中文文件名,那么解压这些文件出来时文件名是乱码的。
分析:

参考这篇文章 让Unzip正确解压其中包含中文文件名的Winzip压缩包 ,原因是unzip试图将zip文件中用 oem(ibm-dos) codepage 编码的文件名转换成自己的内部编码。可惜unzip只能转换极少数几种codepage,中文的 cp936 不在其列。

如果您的系统还未编译安装Unzip


更改源码解决乱码


调试发现问题出现在MultiByteToWideChar方法里,

如 MultiByteToWideChar(CP_ACP,0,fn,-1,tfn,MAX_PATH); 到这里时fn中的name属性值还是正常的,在这个方法内部执行完tfn就乱了。

解决方法:

打开unzip.cpp源文件,找到函数

ZRESULT TUnzip::Get(int index,ZIPENTRY *ze)
{
    // ......
    // ......
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

这个函数里有

#ifdef UNICODE
  MultiByteToWideChar(CP_UTF8,0,fn,-1,tfn,MAX_PATH);
#else
  strcpy(tfn,fn);
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

把 CP_UTF8 改为CP_ACP, ( CP_ACP 指示要使用当前设置的 API 默认 Windows ANSI 代码页)

重新编译后

这样就解决了解压中文文件名称乱码的问题

编译时解决源码问题(无需更改源码)


上面的情况,我们我观察到unzip源代码这段开始的地方有判断

#ifndef Ext_ASCII_TO_Native 
  • 1
  • 1

这样问题似乎更简单了,不用改源代码,只需在make时定义 Ext_ASCII_TO_Native 即可,这样 Ext_ASCII_TO_Native 实际为一个空的宏,不进行任何转换操作。
比如,使用下面的方法编译

make -DExt_ASCII_TO_Native 
  • 1
  • 1

或者在bash执行下面两行

export LOCAL_UNZIP=-DExt_ASCII_TO_Native
make
  • 1
  • 2
  • 1
  • 2

unzip解压缩含中文文件名zip包是出现乱码的问题解决!

如果您的系统已经安装了unzip


方法一 unzip行命令解压,指定字符集


通过unzip行命令解压,指定字符集

unzip -O CP936 xxx.zip (用GBK, GB18030也可以)
  • 1
  • 1

方法二 在环境变量中,指定unzip参数


在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件
/etc/environment中加入2行

UNZIP=”-O CP936″
ZIPINFO=”-O CP936″
  • 1
  • 2
  • 1
  • 2

方法三 利用pyton来处理


复制以下内容(Python)保存未myuzip.py文件脚本,并修改运行权限为可运行(chmod +x uzip)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# uzip.py

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这样以后我们解压缩时只需要运行此文件即可
./myuzip.py xxxx.zip


转载:http://blog.csdn.net/gatieme/article/details/44807105

目录
相关文章
|
2月前
|
Shell Linux API
【Shell 命令集合 备份压缩 】Linux 解压缩文件 unzip命令 使用指南
【Shell 命令集合 备份压缩 】Linux 解压缩文件 unzip命令 使用指南
67 0
|
2月前
|
存储 算法 Shell
【Shell 命令集合 备份压缩 】⭐⭐⭐Linux 解压缩gz工具 gzip命令 使用指南
【Shell 命令集合 备份压缩 】⭐⭐⭐Linux 解压缩gz工具 gzip命令 使用指南
42 0
|
2月前
|
算法 Shell Linux
【Shell 命令集合 备份压缩 】⭐Linux 解压缩 bz2文件 bunzip2命令 使用指南
【Shell 命令集合 备份压缩 】⭐Linux 解压缩 bz2文件 bunzip2命令 使用指南
23 0
|
20天前
|
固态存储 Ubuntu Linux
Linux(29) 多线程快速解压缩|删除|监视大型文件
Linux(29) 多线程快速解压缩|删除|监视大型文件
18 1
|
2月前
|
Linux
linux压缩与解压缩
在Linux中,常用的压缩命令有gzip/gunzip (用于单个文件),bzip2/bunzip2,以及tar (支持gzip, bzip2, xz)。tar还可用于打包多个文件或目录。zip/unzip适用于ZIP格式。使用时注意选项如-c, -z, -j, -J, -x, -v, -f。根据需求选择合适命令,执行时确保目标目录有足够空间和正确权限。
28 3
|
2月前
|
缓存 Linux Windows
Linux下安装宋体以及微软雅黑字体-转PDF后不显示中文,以及中文乱码
Linux下安装宋体以及微软雅黑字体-转PDF后不显示中文,以及中文乱码
72 0
|
2月前
|
算法 Shell Linux
【Shell 命令集合 备份压缩 】Linux 解压缩ARJ格式 unarj命令 使用指南
【Shell 命令集合 备份压缩 】Linux 解压缩ARJ格式 unarj命令 使用指南
34 0
|
2月前
|
存储 算法 Shell
【Shell 命令集合 备份压缩 】⭐⭐⭐Linux 解压缩 tar命令 使用指南
【Shell 命令集合 备份压缩 】⭐⭐⭐Linux 解压缩 tar命令 使用指南
32 0
|
2月前
|
Ubuntu Linux Shell
Linux的中文乱码问题解决方法
Linux的中文乱码问题解决方法