zip压缩包解压乱码问题

zip压缩包解压乱码问题,第1张

由于zip格式中并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,因此,导致这些zip文件在Linux下解压时出现乱码问题,因为Linux下的默认编码是UTF8。目前网上流传一种 unzip -O cp936 的方法,但一些unzip是没有-O这个选项的。

更改源码解决乱码

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

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

解决方法:

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

ZRESULT TUnzip::Get(int index,ZIPENTRY *ze)

{// ......

// ......} 12345

这个函数里有

#ifdef UNICODE

MultiByteToWideChar(CP_UTF8,0,fn,-1,tfn,MAX_PATH)#else

strcpy(tfn,fn)#endif12345

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

重新编译后

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

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

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

#ifndef Ext_ASCII_TO_Native 1

这样问题似乎更简单了,不用改源代码,只需在make时定义 Ext_ASCII_TO_Native 即可,这样 Ext_ASCII_TO_Native 实际为一个空的宏,不进行任何转换 *** 作。

比如,使用下面的方法编译

make -DExt_ASCII_TO_Native 1

或者在bash执行下面两行

export LOCAL_UNZIP=-DExt_ASCII_TO_Native

make12

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

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

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

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

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

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

在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件

/etc/environment中加入2行

UNZIP=”-O CP936″

ZIPINFO=”-O CP936″12

方法三 利用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.close

file.close()

这样以后我们解压缩时只需要运行此文件即可

./myuzip.py xxxx.zip

解压缩乱码和zip本身无关,应该是你的Linux *** 作系统设置的系统语言造成的。

一般来讲Linux的中文默认编码是zh_CN.UTF-8,而Windows的是GB2312,如果你在Windows创建zip压缩包,压缩包中的文件名称是按照GB2312打包的,到Linux解压缩自然成了乱码。

解决方法有两种,可以将Linux的默认编码变为zh_CN.GBK,这可以通过修改/etc/sysconfig/i18n文件来完成;另一种方法就是改用ftp传递未经压缩的文件,这样文件名会被FTP服务自动转码。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8937617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存