欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

zipfile 解压文件名 中文字符 乱码

程序员文章站 2022-04-01 19:41:13
unzip 中文文件名乱码 项目需求及BUG现象: 上传一个.zip格式的压缩文件 解压该test.zip压缩文件 解压zip文件时,遍历其目录下所有子文件,同时计算出单个子文件的有效代码行数 这时,发现解压后的子文件名中文出现乱码,如下图: BUG截图 解决思路 1、解压过程中,发现解压的文件内容 ......

unzip 中文文件名乱码

项目需求及BUG现象:

上传一个.zip格式的压缩文件

解压该test.zip压缩文件

解压zip文件时,遍历其目录下所有子文件,同时计算出单个子文件的有效代码行数

 

这时,发现解压后的子文件名中文出现乱码,如下图:

 

BUG截图

 

zipfile 解压文件名 中文字符 乱码

解决思路

1、解压过程中,发现解压的文件内容正常;

2、使用的是第三方库zipfile模块,因为第1步得到正常的文件内容,本地业务逻辑可先不排查;

3、首先检查zipfile的源码中,针对编码/解码的执行过程仔细排查发现:

zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8

找到下面两处,并追加修正后,乱码现象解决:(追加的decode编码可根据实际情况修改,如linux环境下乱码采用.decode('gbk'))

# zipfile.py

# 第一处
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('utf-8')

# 第二处
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('utf-8')

解决后,正常显示:

zipfile 解压文件名 中文字符 乱码

 

(完)