zoukankan      html  css  js  c++  java
  • Python3中zipfile模块文件名乱码问题

    Linux下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
    #如果是utf-8文本被别的编码方式编码会出现错误,因此不会执行try部分的代码
    try:
        #乱码是由cp437解码而来,将这些乱码还原为比特流
        name = name.encode('cp437')
        #win下一般使用的是gbk编码;将这些比特流按gbk规则解码
        name = name.decode("gbk")
    except:
        #如果已被正确识别为utf8编码时则不需再编码
        pass

    原文链接:https://www.cnblogs.com/CN-S/p/6566395.html

  • 相关阅读:
    KVM(Keyboard、Video、Mouse)
    javascript valueof
    javascript的typeof的返回值
    javascript的===和==
    WGestures全局鼠标手势工具
    向win+x快捷目录添加功能
    好用的影子系统软件
    备份任务栏
    修改多个调用提示最小值_改变多选右键菜单
    执行Windows Update更新
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13982887.html
Copyright © 2011-2022 走看看