如何解决该代码,所以我总是在unicode解码文件名(所以Chineeze,俄罗斯和其他语言支持)?
自动?你不能。基本ZIP文件中的文件名是字节串,没有附加的编码信息,因此除非您知道创建ZIP的计算机上的编码,否则无法可靠地获取可读的文件名。
对现代ZIP文件的标志有一个扩展名,告诉你文件名是UTF-8。不幸的是,你从Windows用户那里收到的文件通常没有它,所以你会用像chardet这样固有的不可靠方法进行猜测。
我已经看到了Python 2的一些示例,但由于字符串的本质在python3中发生了变化,我不知道如何对其进行重新编码或对其应用chardet。
Python 2只会给你原始字节。在Python 3的新特性是:
不幸的是(再次,因为unfortunatelies永远不会结束,其中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')
...
HT tp://stackoverflow.com/questions/1807063/extract-files-with-invalid-characters-in-filename-with-python可能会给你一些答案,特别是第二个答案。 – Kush131