解决python3中解压zip文件是文件名乱码的问题


Posted in Python onMarch 22, 2018

在zip标准中,对文件名的 encoding 用的不是 unicode,而可能是各种软件根据系统的默认字符集来采用(此为猜测),因此zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8。

具体就是查找 zipfile.py 源代码找到下面的代码:

1: if flags & 0x800:
2: # UTF-8 file names extension
3: filename = filename.decode('utf-8')
4: else:
5: # Historical ZIP filename encoding
6: filename = filename.decode('cp437')

可见编码被正确识别为utf8时的情况外,都会被识别并decode为cp437编码,但如果实际是gbk等其他编码时就变为乱码了。所以解决的方法在于被decode为cp437后重新再手动转为正确的编码。

具体代码如下:

#修改代码
if flags & 0x800:
 # UTF-8 file names extension
 filename = filename.decode('utf-8')
else:
 # Historical ZIP filename encoding
 filename = filename.decode('cp437')
 #修改
 filename = filename.encode("cp437").decode('gbk')

后面一处同样如此修改

if zinfo.flag_bits & 0x800:
 # UTF-8 filename
 fname_str = fname.decode("utf-8")
else:
 fname_str = fname.decode("cp437")
 #修改
 fname_str = fname_str.encode("cp437").decode('gbk')

亲测有效!

以上这篇解决python3中解压zip文件是文件名乱码的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例详解Python中循环语句的嵌套使用
May 14 Python
Python从零开始创建区块链
Mar 06 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python中函数参数调用方式分析
Aug 09 Python
对Python 语音识别框架详解
Dec 24 Python
对Python实现累加函数的方法详解
Jan 23 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
简单了解python列表和元组的区别
May 14 Python
python中绕过反爬虫的方法总结
Nov 25 Python
Python爬虫工程师面试问题总结
Mar 22 #Python
Python入门必须知道的11个知识点
Mar 21 #Python
python使用Tesseract库识别验证
Mar 21 #Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 #Python
python如何通过实例方法名字调用方法
Mar 21 #Python
python如何为被装饰的函数保留元数据
Mar 21 #Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 #Python
You might like
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
JavaScript函数、方法、对象代码
2008/10/29 Javascript
jQuery 操作XML入门
2008/12/25 Javascript
js 编写规范
2010/03/03 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
js获取地址栏参数的两种方法
2017/06/27 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
python的迭代器与生成器实例详解
2014/07/16 Python
python正则表达式中的括号匹配问题
2014/12/14 Python
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
python super函数使用方法详解
2020/02/14 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
材料加工工程求职信
2014/02/19 职场文书
班班通项目实施方案
2014/02/25 职场文书
cf收人广告词
2014/03/14 职场文书
党员公开承诺事项
2014/03/25 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书