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