如何修复该代码,以便我始终以 unicode 解码文件名(因此支持 Chineeze、俄语和其他语言)?
自动地?你不能。基本 ZIP 文件中的文件名是没有附加编码信息的字节字符串,因此除非您知道创建 ZIP 的机器上的编码是什么,否则您无法可靠地获取人类可读的文件名。
现代 ZIP 文件上的标志有一个扩展名,告诉您文件名是 UTF-8。不幸的是,你从 Windows 用户那里收到的文件通常没有它,所以你会用 chardet 等固有的不可靠方法来猜测。
我已经看过一些 Python 2 的示例,但由于字符串的性质在 python3 中发生了变化,我不知道如何重新编码它,或者在它上面应用 chardet。
Python 2 只会给你原始字节。在 Python 3 中,新行为是:
不幸的是(再次,因为不幸的是,在 ZIP 方面永远不会结束),ZipFile
在没有告诉你它做了什么的情况下默默地解码。因此,如果您想切换并仅在文件名可疑时执行转码步骤,则必须复制用于嗅探是否设置了 UTF-8 标志的逻辑:
ZIP_FILENAME_UTF8_FLAG = 0x800
for info in ZipFile('zipfile.zip').filelist():
filename = info.filename
if info.flag_bits & ZIP_FILENAME_UTF8_FLAG == 0:
filename_bytes = filename.encode('437')
guessed_encoding = chardet.detect(filename_bytes)['encoding'] or 'cp1252'
filename = filename_bytes.decode(guessed_encoding, 'replace')
...