参考链接: Python zip()

今天突然碰到zip文件解压后中文乱码问题。百度了下觉得这篇文章不错。保存保存。

来源:http://blog.sina.com.cn/s/blog_5805e98101012uzv.html

万恶的编码!!!!!!!!!!  学习 python 2.x 时就被时不时出现的中文乱码问题搞得头大,无奈用起来资料挺少、支持不多的 python 3.x,没想到昨天来解压缩一大堆文件时仍然遇到乱码的问题,对 python 3.x 失望之极。不得已,又拿起C#来解决。其实在C#中也有乱码的问题,最终是用 FileStream 变相解决的。  所以其实最初可能冤枉了 python 3.x 了,自它采用 unicode 之后,乱码问题其实少多了,有的时候还是不熟练。  今天又硬着头皮看 ZipFile 的源代码,在一堆英文资料中翻来翻去。其实这一 bug 已经早被提出来了,只是没有解决,可能是负责解决问题的大牛们都不用中文系统,尤其是都不用中文Windows系统,所以官方居然说已经修复了。

下面说一下原因及解决办法。

在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')

修改如下:

1: if sys.getfilesystemencoding()=='mbcs':

2: filename=filename.decode('mbcs')

3: elif flags & 0x800:

4: # UTF-8 file names extension

5: filename = filename.decode('utf-8')

6: else:

7: # Historical ZIP filename encoding

8: filename = filename.decode('cp437')

后面一处同样如此修改:

1: if sys.getfilesystemencoding()=='mbcs':

2: fname_str = fname.decode('mbcs')

3: elif zinfo.flag_bits & 0x800:

4: # UTF-8 filename

5: fname_str = fname.decode("utf-8")

6: else:

7: fname_str = fname.decode("cp437")

当然这种办法只是暂时性的解决了这一问题,可能在其它系统中采用会带来更多的问题。

[转载] python zip 文件解压中文乱码问题解决相关推荐

  1. zip压缩包解压中文乱码问题

    zip压缩包解压中文乱码问题 zip格式中并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,导致这些zip文件在Linux下解压时出现乱码问题,因为Linux下的默 ...

  2. linux php 压缩中文乱码,linux下zip文件解压乱码问题的解决办法分享

    本篇文章主要介绍了解决linux下zip文件解压乱码问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 原因 由于zip格式并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/ ...

  3. linux 解压文件乱码,云服务器:解决linux下zip文件解压乱码问题

    云服务器:解决linux下zip文件解压乱码问题 原因 由于zip格式并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,因此,导致这些zip文件在Linux下解压时 ...

  4. linux中zip文件编码错误,解决linux下zip文件解压乱码问题

    原标题:解决linux下zip文件解压乱码问题 解决linux下zip文件解压乱码问题 原因 由于zip格式并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,因此, ...

  5. Java实现Zip文件解压

    2019独角兽企业重金招聘Python工程师标准>>> ##1. 两种java实现zip文件解压方式 使用JDK的原生类java.util.zip,上代码: import java. ...

  6. 解压文件到服务器是什么意思,linux中zip文件解压命令是什么

    linux中zip文件解压命令是什么 发布时间:2020-10-15 14:35:15 来源:亿速云 阅读:102 作者:小新 这篇文章给大家分享的是有关linux中zip文件解压命令是什么的内容.小 ...

  7. android zip文件读写,【Android】Zip文件解压方法

    android中zip文件解压 public class ZipUtil { /** * 解压到指定路径 * * @param inputStream * @param outPathString * ...

  8. C++实现解zip解压缩功能:将一个目录内的内容打包到zip文件以及将zip文件解压到某个目录(windows平台)

    本例用来简单实现windows平台下如何将一个目录下的文件压缩到指定的zip文件中,亦或是将一个zip文件的内容解压缩到某个目录. 以下是源码,代码中的注释解释了相关操作,一看就懂. 注: 本例将这两 ...

  9. python zipfile extract 解压 中文文件名

    python zipfile模块官网 正常使用: 解压缩: ZipFile.extract(member,path = None,pwd = None ) 参数 解释 members zipfile ...

最新文章

  1. tftp:timeout问题解决 - 从Windows传输文件到开发板
  2. R语言If、Else条件语句实战
  3. 1.2控制台的大体设置:
  4. c#后台线程更新界面
  5. 【最爽的日期工具包LocalDate·超爽,超实用】(Java8版本)
  6. C语言计算分段函数pta,PTA浙大版《C语言程序设计(第3版)》题目集 练习2-11 计算分段函数[2] (10分)...
  7. 2018计算机应用基础考试6,2018结构工程师《计算机应用基础》试题(6)
  8. popen 如何获取指令执行情况_Linux下使用popen()执行shell命令
  9. 查看linux上卸载mysql数据库_linux卸载mysql数据库
  10. linux 查找字母c结尾的内容,linux如何查找以某个字母打头的文件或文件夹 比如,/etc目录下很多文件,我想列出所有以c开头的文件或文件...
  11. oracle mos账号金额,mos账号注正册步骤+证书查询+注意事项.pptx
  12. jquery导入数据_python大数据实践之三:对分析结果可视化呈现
  13. 使用计算机粘贴板的步骤,电脑自带剪贴板怎么打开?剪贴板打开教程
  14. 《c 语言程序设计》宝钏,【黄钟】醉花阴_宝钏松金髻
  15. 后摩尔时代新星之自旋电子器件
  16. 鸡脚蹬子生长秘籍 鸡脚蹬子短是缺乏什么营养
  17. 《Linux内核情景分析》阅读笔记
  18. html跳转qq浏览器,导入其他书签
  19. 自定义Android消息推送提示音
  20. 你们知道工控资料窝吗

热门文章

  1. layer 父弹出框上弹出子弹框窗体大小问题
  2. 2020 CTF暑假夏令营培训Day1 安全杂项Misc
  3. 【基础】算法时空复杂度【OI缩水版】
  4. c++低通数字滤波器_快速扫盲之一阶RC低通数字滤波器算法实现
  5. mysql优化教程_Mysql优化一
  6. JAVA常用工具类→Date、SimpleDateFormat、Calendar、System、Math
  7. JAVA循环结构、break、continue、循环嵌套
  8. 管理系统中的计算机应用答案,《管理系统中计算机应用》试卷答案
  9. 芝加哥计算机科学硕士录取难度,美国cs研究生申请难度有多大?
  10. blob 按换行 分裂_Blob对象介绍