解决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根据出生日期返回年龄的方法
Mar 26 Python
python使用pil生成图片验证码的方法
May 08 Python
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
python如何生成各种随机分布图
Aug 27 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
python读取ini配置文件过程示范
Dec 23 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
python实现简单的五子棋游戏
Sep 01 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
python中四舍五入的正确打开方式
Jan 18 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
深入PHP数据加密详解
2013/06/18 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
java解析json方法总结
2019/05/16 PHP
JS中如何设置readOnly的值
2013/12/25 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
农民工创业典型事迹
2014/01/25 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
护士实习求职信
2014/06/22 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
先进教师事迹材料
2014/12/16 职场文书
小学生表扬稿范文
2015/05/05 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL