Python3中zipfile模块文件名乱码问题

本文探讨了Linux环境下使用Python处理zip文件时遇到的文件名乱码问题。主要原因是zip标准未采用统一的Unicode编码,而是依赖系统默认字符集。文章提供了针对中文乱码的具体解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

inux下zip文件乱码已经是一个常见问题了,再加上python想不遇到乱码问题都难。

 

在zipfile.ZipFile中获得的filename有中日文则很大可能是乱码,这是因为

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

具体zipfile模块中的源代码如下

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

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

#这里是在ZipFile.infolist()方法获得的info中取得filename
name = info.filename
try:
    #使用cp437对文件名进行解码还原
    name = name.encode('cp437')
    #win下一般使用的是gbk编码
    name = name.decode("gbk")
except:
    #如果已被正确识别为utf8编码时则不需再编码
    pass

转载于:https://www.cnblogs.com/CN-S/p/6566395.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值