2015-11-26 79 views
0

我有一個具有Unicode名稱的文件,說'קובץ.txt'。我想打包他,我正在使用python的zipfilePython - 如何將unicode文件名轉換爲CP437?

我可以壓縮文件,稍後打開它們,但使用Windows 7文件資源管理器查看文件時(7zip很好),文件名會混淆。

根據該文檔,這是一個常見的問題,對於如何處理這一指令:

從ZipFile.write

注意

沒有ZIP文件的官方文件名編碼。如果您有 unicode文件名,,則必須先將它們轉換爲 所需的編碼中的字節字符串,然後再將它們傳遞給write()。 WinZip解釋所有 文件名稱,編碼在CP437中,也稱爲DOS Latin。

對不起,但我似乎無法得到我應該怎麼處理文件名。我試過.encode('CP437'),.decode('CP437') ..

+0

'zipfile'模塊使用utf-8編碼而不是cp437來處理非ascii文件名並設置'flag_bits | 0x800'同時壓縮。 utf-8編碼支持完整的Unicode範圍(忽略單獨的代理)。你可以使用Python來壓縮/解壓文件。或使用'-mcu'開關使用7-zip解壓縮。另請參閱[正確解碼zip條目文件名稱 - CP437,UTF-8或?](http://stackoverflow.com/q/13261347/4279) – jfs

+0

更改問題的標題,與您的實際更密切相關任務,例如「用非ascii條目創建一個zip檔案」。 「קובץ。txt''從哪裏來?它是作爲命令行參數給出的嗎?什麼是你的Python版本?如果從命令行運行'py -mzipfile -c archive.zipקובץ。txt',會在包含'קובץ。txt'文件的目錄中執行什麼操作? – jfs

回答

4

您必須將您的Unicode字符串編碼爲CP437。但是,你不能編碼您的具體的例子,因爲CP437編解碼器不支持希伯來語:

>>> u'קובץ.txt'.encode('cp437') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp437.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-3: character maps to <undefined> 

上述錯誤告訴你,前4個字符(קובץ)不能被編碼,因爲沒有這樣的字符在目標字符集。 CP437僅支持西方字母(A-Z,重音字符如ç和é),IBM線描字符(如╚和┤)以及一些希臘符號,主要用於數學方程(如Σ和φ)。

你要麼必須生成一個不同的文件名,只能使用characters supported by the CP437 codec,或者忍受WinZip永遠無法正確顯示希伯來文件名的事實,並且只需使用7zip爲您工作的字符集。

+0

謝謝。 我想我需要重新說明我的問題,我正在使用Windows 7來測試,我認爲Windows資源管理器是我用來打開文件的程序。 無論如何,我可以使用程序創建包含希伯來文文本的zip文件,例如「Total Commander」,我無法用python的zip文件創建相同的東西 –

+2

@ A-Palgy:您需要展示更多關於你如何做的信息,比如你的文件名是什麼類型的對象(例如編碼字符串或者「unicode」對象)。當您使用Total commander創建zip文件時,WinZip中的外觀如何?什麼編解碼器用於文件名,你知道嗎?你將不得不使用Python中的相同編解碼器。 –

+0

如何檢查文件名使用哪種編解碼器? –

0

試試這個

import zipfile 
p=b'\xd7\xa7\xd7\x95\xd7\x91\xd7\xa5.txt'.decode('utf8') 
# or just: 
# p='קובץ.txt' 
z=zipfile.ZipFile('test.zip','w') 
f=z.open(p.encode('utf8').decode('cp437'),'w') 
f.write(b'hello world') 
f.close() 
z.close() 

我試過在MacOSX上,所以它不是CP437以上,但UTF8,和它的作品

我希望這個工作在Windows

我已經測試使用類似代碼讀取具有「gbk」或「gb18030」編碼的中文文件名。它運作良好。

當你從一個zip壓縮文件(或需要將其發送到)的Mac/Linux的,在代碼爲utf8變化CP437,一切工作

當你從一個zip壓縮文件(或者需要發送to)Windows,使cp437保持不變