2012-03-15 77 views
2

我想添加幾個文件到一個zip的Python的zipfile庫。 問題在於壓縮的文件名,其中包含特殊字符(utf-8)。python zipfile編碼爲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編碼:)