Python中可以使用zipfile库处理zip文件的压缩和解压的问题。但是如果文件名或目录名中存在中文,zipfile解压后就会出现乱码的问题。通过网络和查zipfile库代码,在解压的时候,只针对utf-8和cp437编码作处理:
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')
但由于每个操作系统的默认编码不同,例如中文操作系统一般是GBK编码,这样就会导致解压的时候,出现乱码的情况。
解决这个问题,网上有三种解决办法:
办法一:在压缩的时候,就指定编码
由于zipfile只识utf-8和cp437,那么直接指定其中一种编码就可以。例如,使用7zip压缩的时候记得 -mcu,指定使用utf-8编码文件名,例如:
zip_command = '"D:\\Program Files (x86)\\7-Zip\\7z.exe" a -tzip -mcu {0} {1} '.format(target, ' '.join(source))
但这个有局限性,自己压缩的还能指定编码,如果是用户上传的,就没办法了。
办法二:直接修改源代码
Python是坏果仁开发的,坏果仁有些习惯和天朝有所不同,那么就把这些习惯改成咱们的习惯,这样咱们用户起来最省事,完全不用多一行代码。例如将上面的代码改成:
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('gbk')
但是这个也有问题,如果程序在其它机器上部署时,或默认编码不是gbk时,依然会有同样的问题出现。
办法三:通过重命名改成正确的名称
这个办法的思路是,由于zipfile压缩后的文件名是经过utf-8或cp437编码的,那么对输出的文件名或目录名做解码,再将编码成合适的编码就可以。例如:
def corrector(folder):
'''
解决zipfile解压后,文件名乱码的问题
'''
os.chdir(folder)
for temp_name in os.listdir('.'):
try:
new_name = temp_name.encode('cp437').decode('gbk')
except:
new_name = temp_name.encode('utf-8').decode('utf-8')
if(new_name != temp_name):
#对乱码的文件名及文件夹名进行重命名
os.rename(temp_name, new_name)
#传回重新编码的文件名给原文件名
temp_name = new_name
if os.path.isdir(temp_name):
#对子文件夹进行递归调用
corrector(temp_name)
#记得返回上级目录
os.chdir('..')
an_garcode(os.getcwd())
这个办法也不能解决所有问题,例如当不是UTF-8或CP437时,但仍然可以用这个思路解决之。
相关链接
python 之路,致那些年,我们依然没搞明白的编码 https://www.cnblogs.com/alex3714/articles/7550940.html
Python - zipfile 乱码问题解决 https://www.cnblogs.com/ligaofeng/p/11280001.html
python3 zipfile解压中文乱码问题解决 https://blog.csdn.net/mp9105/article/details/80288549
Python 中使用 zipfile 以及中文乱码问题 https://blog.csdn.net/zzphapy/article/details/81703539