2012-03-15 2 views
2

Я пытаюсь добавить несколько файлов в zip с помощью библиотеки zipfile от Python. Проблема заключается в имени файла, который является zipped, который содержит специальные символы (utf-8).python zipfile encoding for arcname

Вот основной код:

#!/usr/bin/env python 

import zipfile 

infilename = "test_file" 
outfilename = "test.zip" 
filename = u'Conf\xe9d\xe9ration.txt' 

if __name__ == '__main__': 
    f = open(outfilename, "w") 
    archive = zipfile.ZipFile(f, "w", zipfile.ZIP_DEFLATED) 
    archive.write(infilename, filename.encode("CP437")) 
    archive.close() 
    f.close() 

Файл генерируется не правильно читается с каждым почтовым экстрактор:

  • Ubuntu 10,04 & 11,10: Conf d ration.txt
    ? Файл не может быть извлечен: «Предупреждение: имя файла не соответствует: Conf \? D \? Ration.txt»

  • Wi ndows XP & 7: Confédération.txt
    Файл может быть прочитан

  • MacOSX (Лев): ConfÇdÇration.txt
    Файл может быть прочитан

Я попытался без кодирования для CP437 изменения только одну строку чтобы:

archive.write(infilename, filename) 

на этот раз Ubuntu имеет еще такую ​​же проблему, Windows дает "Conf + ®d + ®ration.txt" и MacOSX работает отлично.

Кто-то знает (pythonic) решение с поперечной пластинкой?

Спасибо!

ответ

1

Похоже имя файла написано «как есть» (т.е. первый раз это написано в кодировке CP437, а второй - в UTF8), в то время как другие архивные обработчики используют другой подход:

  • для Windows: это использует DOS/OEM-кодировку для имен файлов внутри архива, поэтому CP437 работает. И это поведение описано в стандарте PKWare;
  • Mac OS: он молча использует utf-8, что нарушает стандарт. Вот почему utf8 работает в Mac OS.
  • Linux/Unix: они используют системную страницу код для имен файлов внутри архива, не знаю, какой из них ваша установка Linux настроена, но не для DOS, а не для UTF8 кодирования :)