Python - 如何将unicode文件名转换为CP437?

时间:2015-11-26 15:09:11

标签: python unicode zipfile

我有一个具有Unicode名称的文件,比如'קובץ.txt'。我想打包他,我正在使用python' zipfile

我可以压缩文件并稍后打开它们,除了在使用Windows 7文件浏览器查看文件时文件名混乱(7zip效果很好)。

根据文档,这是一个常见问题,并且有关于如何处理该问题的说明:

  

来自ZipFile.write

     

注意

     

ZIP文件没有正式的文件名编码。如果你有   unicode文件名,你必须将它们转换为你的字节串   在将它们传递给write()之前需要编码。 WinZip解释所有   CP437中编码的文件名,也称为DOS Latin。

很抱歉,但我似乎无法确定我应该对文件名做什么。我已尝试.encode('CP437').decode('CP437') ..

2 个答案:

答案 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不变