Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何将unicode文件名转换为CP437?_Python_Unicode_Zipfile - Fatal编程技术网

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

Python-如何将unicode文件名转换为CP437?,python,unicode,zipfile,Python,Unicode,Zipfile,我有一个Unicode名称的文件,比如说“קובץ.txt”。我想把他打包,我用的是python的 我可以压缩文件并在以后打开它们,但在使用Windows7文件资源管理器查看文件时,文件名会弄乱(7zip非常有用) 根据文档,这是一个常见的问题,并且有关于如何处理该问题的说明: 从ZipFile.write 注意 ZIP文件没有正式的文件名编码。如果你有 unicode文件名,必须在 将它们传递给write()之前所需的编码。WinZip解释所有 CP437编码的文件名,也称为DOS拉丁语 对不

我有一个Unicode名称的文件,比如说
“קובץ.txt”
。我想把他打包,我用的是python的

我可以压缩文件并在以后打开它们,但在使用Windows7文件资源管理器查看文件时,文件名会弄乱(7zip非常有用)

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

从ZipFile.write

注意

ZIP文件没有正式的文件名编码。如果你有 unicode文件名,必须在 将它们传递给write()之前所需的编码。WinZip解释所有 CP437编码的文件名,也称为DOS拉丁语


对不起,我似乎不知道该如何处理文件名。我试过
.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/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>
>>u'קובץ.txt'.encode('cp437'))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp437.py”,第12行,编码
返回编解码器.charmap\u encode(输入、错误、编码\u映射)
UnicodeEncodeError:“charmap”编解码器无法对位置0-3中的字符进行编码:字符映射到
上面的错误告诉您,前4个字符(
קובץ
)无法编码,因为目标字符集中没有此类字符。CP437仅支持西方字母表(A-Z和重音字符,如ç和é)、IBM划线字符(如╚ 及┤) 还有一些希腊符号,主要用于数学方程(如∑和φ)


您必须生成一个仅使用的不同文件名,或者接受WinZip永远无法正确显示希伯来文文件名的事实,只需使用7zip的字符集即可。

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

>>> 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>
>>u'קובץ.txt'.encode('cp437'))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp437.py”,第12行,编码
返回编解码器.charmap\u encode(输入、错误、编码\u映射)
UnicodeEncodeError:“charmap”编解码器无法对位置0-3中的字符进行编码:字符映射到
上面的错误告诉您,前4个字符(
קובץ
)无法编码,因为目标字符集中没有此类字符。CP437仅支持西方字母表(A-Z和重音字符,如ç和ç)、IBM划线字符(如╚ 及┤) 还有一些希腊符号,主要用于数学方程(如∑和φ)

您必须生成一个仅使用的不同文件名,或者接受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不变

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(或需要发送到Windows)的zip存档文件时,请保持cp437不变

谢谢。我想我需要重新表述我的问题,我正在使用Windows 7进行测试,我认为Windows资源管理器是我用来打开a文件的程序。无论如何,我能够用一个程序创建包含希伯来文的zip文件,如“Total commander”,我只是不能用python的zipfile@A-Palgy:您需要显示更多关于如何执行此操作的信息,例如文件名是什么类型的对象(例如,编码字符串或
unicode
对象)。当您使用Total commander创建zip文件时,WinZip中是什么样子的?文件名使用了什么编解码器,您知道吗?您必须使用来自Python的相同编解码器。如何检查文件名使用了什么编解码器?打开zipfile时原始数据是什么样子的?
repr(name)
将为您提供字节的可重用表示(在Python 2中)应该立即清楚是否使用了UTF-8或UTF-16,例如,应该立即清楚是否使用了UTF-8或UTF-16,例如。例如,该文件名的文件名的报告看起来像这样:
,,应该立即清楚是使用了UTF-8或UTF-8或UTF-8或UTF-16,例如。例如,该文件名的文件名的报告看起来像这样:::
,“
\\\\\\\\\\\\\\\\\ 4.4.4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 10 10\10\10\10\10\10\10\10\10\\\\\\\\\ 10\\\\\\ 10\14(10(10)10(本本本应该是本本本本应该是本应该是本本本本应该是本应该是本本应该是本本本我现在就用7zip谢谢我想我需要重新表述我的问题,我正在使用windows 7进行测试,我认为windows资源管理器是我用来打开a文件的程序。无论如何,我能够用一个程序创建包含希伯来文的zip文件,如“Total commander”,我只是不能用python的zipfile@A-Palgy:你需要展示更多的信息,比如你的文件名是什么类型的对象(例如编码字符串或
unicode
对象)。当你使用Total commander创建一个zip文件时,你需要做什么