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

问题描述 投票:0回答:3

我有一个具有 Unicode 名称的文件,比如

'קובץ.txt'
。我想打包他,我用的是python的zipfile.

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

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

来自 ZipFile.write

注意

ZIP 文件没有官方的文件名编码。如果你有 unicode 文件名,你必须在你的 所需的编码,然后再将它们传递给 write()。 WinZip 解释所有 在 CP437 中编码的文件名,也称为 DOS Latin.

抱歉,但我似乎不明白我应该如何处理文件名。我试过

.encode('CP437')
.decode('CP437')
..

python unicode zip
3个回答
8
投票

你必须将你的 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 画线字符(如 ╚ 和 ┤)和一些希腊符号,主要用于数学方程式(如 Σ 和 φ)。

您要么必须生成一个仅使用 CP437 编解码器支持的 字符 的不同文件名,要么忍受 WinZip 永远无法正确显示希伯来语文件名的事实,并简单地坚持为您工作的字符集7zip.


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

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

当您从(或需要将其发送到)Windows 获得 zip 存档时,请保持 cp437 不变


0
投票

对于 CP866(俄语)这有效:

    from zipfile import ZipFile, ZipInfo

    class ZipInf(ZipInfo):
        def __init__(self, filename):
            super().__init__(filename)
            self.create_system = 0
        def _encodeFilenameFlags(self):
            return self.filename.encode('cp866'), self.flag_bits

    with ZipFile('ex.zip', 'w') as zipf:
        zipf.writestr(ZipInf('Файл'), '123456789'*1024)

它将目录和文件名保存在 cp866 编码的 zip 中(这里只有 'Файл' 文件)。

© www.soinside.com 2019 - 2024. All rights reserved.