我创建了一个Python脚本,用于使用" email“模块读取电子邮件文件,并将其附件提取到文件系统中,压缩提取的文件并将zip文件发送给某人。
附件可能有Unicode文件名,如中文或日文。我发现模块"email.header.decode_header“可以检索文件名及其编码。例如:
decode_header(payload.get_filename())将产生:
[('2015\xe5\xb9\xb4\xe6\xb5\x81\xe5\xb9\xb4_Test.pages', 'utf-8')]哪个文件名是由UTF-8编码的。或
[('\x1b$B%Q%=%3%s;q;:4IM}BfD"!J\x1b(BS&T HK\x1b$B!K\x1b(B_\x1b$B8=COD4C#\x1b(BPC.xls', 'iso-2022-jp')] 包含日语字符。
在脚本中,我将文件名转换为UTF-8,并保存在文件系统(Linux)中,然后创建一个Zip文件,然后通过电子邮件发送Zip文件。当用户检索并解压缩Windows中的zip文件时,Zip文件中的文件名将变为垃圾。
我搜索谷歌和StackOverflow,我发现Windows文件系统是Unicode而不是UTF-8。因此,我可以打开Zip文件,在MacOS上没有问题,但在Windows上有问题。我还尝试将脚本更改为以Unicode格式命名文件:
filename = unicode('\x1b$B%Q%=%3%s;q;:4IM}BfD"!J\x1b(BS&T HK\x1b$B!K\x1b(B_\x1b$B8=COD4C#\x1b(BPC.xls', 'iso-2022-jp')
f = open(filename, 'wb')
....当我在Python中尝试上述命令时,我可以创建一个没有问题的文件。但是,当我将准确的命令放入脚本中时,会出现错误
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)已显示。
有没有人能建议我如何解决这个问题,这样我就可以创建一个Zip文件,它可以在Windows中以正确的名称打开。
发布于 2015-06-11 02:04:37
最后,我发现了为什么我可以在Python解释器中成功创建文件但在Python脚本中失败的原因。我发现Python解释器的LANG环境是"en_US.UTF8“,而在我的Python脚本中是"C”。
import os
print os.environ['LANG']我认为问题在于,当我在Python脚本中创建一个具有中文或日语文件名的文件时,会产生错误。
我试图通过以下方式运行Python脚本:
env LANG=en_US.UTF8 myscript.py把郎朗换成8级。问题解决了。
发布于 2015-06-05 15:14:40
恐怕没有很好的解决办法。AFAIK,ZIP中的文件名是一个8位字符串。因此,您必须按照自己选择的编码方式对其进行编码,而utf8在Linux和Mac上将被正确理解。
在windows上,您所能做的最好是翻译zip文件:
或者,尝试为存档使用另一种格式,因为7z格式应该接受unicode名称。
https://stackoverflow.com/questions/30668360
复制相似问题