首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Unicode文件名在Linux中创建文件

用Unicode文件名在Linux中创建文件
EN

Stack Overflow用户
提问于 2015-06-05 13:54:52
回答 2查看 3.9K关注 0票数 1

我创建了一个Python脚本,用于使用" email“模块读取电子邮件文件,并将其附件提取到文件系统中,压缩提取的文件并将zip文件发送给某人。

附件可能有Unicode文件名,如中文或日文。我发现模块"email.header.decode_header“可以检索文件名及其编码。例如:

代码语言:javascript
复制
decode_header(payload.get_filename())

将产生:

代码语言:javascript
复制
[('2015\xe5\xb9\xb4\xe6\xb5\x81\xe5\xb9\xb4_Test.pages', 'utf-8')]

哪个文件名是由UTF-8编码的。或

代码语言:javascript
复制
[('\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格式命名文件:

代码语言:javascript
复制
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中尝试上述命令时,我可以创建一个没有问题的文件。但是,当我将准确的命令放入脚本中时,会出现错误

代码语言:javascript
复制
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)

已显示。

有没有人能建议我如何解决这个问题,这样我就可以创建一个Zip文件,它可以在Windows中以正确的名称打开。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-11 02:04:37

最后,我发现了为什么我可以在Python解释器中成功创建文件但在Python脚本中失败的原因。我发现Python解释器的LANG环境是"en_US.UTF8“,而在我的Python脚本中是"C”。

代码语言:javascript
复制
import os
print os.environ['LANG']

我认为问题在于,当我在Python脚本中创建一个具有中文或日语文件名的文件时,会产生错误。

我试图通过以下方式运行Python脚本:

代码语言:javascript
复制
env LANG=en_US.UTF8 myscript.py

把郎朗换成8级。问题解决了。

票数 0
EN

Stack Overflow用户

发布于 2015-06-05 15:14:40

恐怕没有很好的解决办法。AFAIK,ZIP中的文件名是一个8位字符串。因此,您必须按照自己选择的编码方式对其进行编码,而utf8在Linux和Mac上将被正确理解。

在windows上,您所能做的最好是翻译zip文件:

  • 提取所有文件
  • 对于每个文件
    • 将其名称作为8位字符串。
    • 将名称解码为utf8,转换为unicode字符串
    • 将其编码为8位字符串,并在windows上使用本机编码(通常在latin1语言中使用windows-1252 )
    • 用这个新名称重命名文件

  • 用重命名的文件构建一个新的zip

或者,尝试为存档使用另一种格式,因为7z格式应该接受unicode名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30668360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档