我有一个具有Unicode名称的文件,比如'קובץ.txt'
。我想打包他,我正在使用python' zipfile。
我可以压缩文件并稍后打开它们,除了在使用Windows 7文件浏览器查看文件时文件名混乱(7zip效果很好)。
根据文档,这是一个常见问题,并且有关于如何处理该问题的说明:
来自ZipFile.write
注意
ZIP文件没有正式的文件名编码。如果你有 unicode文件名,你必须将它们转换为你的字节串 在将它们传递给write()之前需要编码。 WinZip解释所有 CP437中编码的文件名,也称为DOS Latin。
很抱歉,但我似乎无法确定我应该对文件名做什么。我已尝试.encode('CP437')
,.decode('CP437')
..
答案 0 :(得分:5)
您必须将Unicode字符串编码为CP437。但是,您无法对特定示例进行编码,因为CP437编解码器不支持希伯来语:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class="left">
<div class="form">
<p>form</p>
<input type="text">
</div>
<div class="form">
<p>form</p>
<input type="text">
</div>
<div class="form">
<p>form</p>
<input type="text">
</div>
<div class="form">
<p>form</p>
<input type="text">
</div>
</div>
<div class="right">
<div class="form">
<p>form</p>
<input type="text">
</div>
<div class="form">
<p>form</p>
<input type="text">
</div>
</div>
上述错误告诉您前4个字符(>>> 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>
)无法编码,因为目标字符集中没有此类字符。 CP437仅支持西方字母(AZ,重音字符,如ç和é),IBM线条图字符(如╚和┤)和一些希腊符号,主要用于数学方程式(如Σ和φ)。
你要么必须生成一个只使用characters supported by the CP437 codec的不同文件名,要么生活在WinZip永远无法正确显示希伯来文件名这一事实的情况下,并坚持使用适合你的字符集7zip的。
答案 1 :(得分: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
我用&#34; gbk&#34;来测试中文文件名。或&#34; gb18030&#34;用类似的代码编码。它运作良好。
如果您有一个zip存档(或需要将其发送到)Mac / Linux,请将代码中的cp437更改为utf8,一切正常
当您拥有一个zip存档(或需要将其发送到)Windows时,请保持cp437不变