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

参考链接: 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") 

  

 

   

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值