Pine Blog

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){    // ......    // ......}

这个函数里有

ifdef UNICODE  MultiByteToWideChar(CP_UTF8,0,fn,-1,tfn,MAX_PATH);#else  strcpy(tfn,fn);#endif

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

重新编译后

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

编译时解决源码问题(无需更改源码)
上面的情况,我们我观察到unzip源代码这段开始的地方有判断

ifndef Ext_ASCII_TO_Native

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

make -DExt_ASCII_TO_Native

或者在bash执行下面两行

export LOCAL_UNZIP=-DExt_ASCII_TO_Nativemake

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

如果您的系统已经安装了unzip
方法一  unzip行命令解压,指定字符集
通过unzip行命令解压,指定字符集

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

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

UNZIP=”-O CP936″ZIPINFO=”-O CP936″

方法三  利用pyton来处理
复制以下内容(Python)保存未myuzip.py文件脚本,并修改运行权限为可运行(chmod +x uzip)

!/usr/bin/env python

-- coding: utf-8 --

uzip.pyimport osimport sysimport zipfileprint "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.closefile.close()

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

未经允许不得转载:Pine Blog » Linux下使用unzip解压缩中文乱码问题

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

Pine Blog
Anywhere, Anytime
E-mail:59054872@qq.com
苏ICP备15059480号-1