Python3 zipfile解压文件名是中文 解压后乱码

问题描述:利用python3 的zipfile模块解压zip文件包,这个文件包中有的文件名是中文,解压后这个中                    文文件名显示为乱码。

问题分析:因此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')

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

解决方案:许多人想到修改源码文件,杀鸡还要用牛刀。其实可以不用。只需要把显示为乱码的文件名 转换成utf-8编码格式就能正确显示。

import os

import zipfile

r = zipfile.is_zipfile('test.zip')

if r:

        fz = zipfile.ZipFile(zip_src, 'r')

        for file in fz.namelist():

            fz.extract(file)

            right_file = file.encode('cp437').decode('utf-8')

            os.rename(file,right_file)

你可能感兴趣的:(Python3 zipfile解压文件名是中文 解压后乱码)