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

Python - how to convert unicode filename to CP437?

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

我可以压缩文件并稍后打开它们,但出现问题,只是在使用 windows 7 文件资源管理器查看文件(7zip 效果很好)时文件名被弄乱了。

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

From ZipFile.write

Note

There is no official file name encoding for ZIP files. If you have unicode file names, you must convert them to byte strings in your desired encoding before passing them to write(). WinZip interprets all file names as encoded in CP437, also known as DOS Latin.

抱歉,我似乎不明白我应该如何处理文件名。我试过 .encode('CP437'), .decode('CP437')..

您必须将 Unicode 字符串编码为 CP437。但是,您无法对特定示例进行编码,因为 CP437 编解码器不支持希伯来语:

>>> u'קובץ.txt'.encode('cp437')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/venvs/Whosebug-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.

试试这个

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" 编码读取中文文件名。而且效果很好。

当您有来自(或需要将其发送到)Mac/Linux 的 zip 存档时,将代码中的 cp437 更改为 utf8,一切正常

当您有来自(或需要将其发送至)Windows 的 zip 存档时,保持 cp437 不变