文件名类似于:
filename = u"/direc/tories/español.jpg"
使用open()函数如下:
fp = open(filename, "rb")
这将正确打开在OSX(10.7)上的文件,但是在Ubuntu 11.04上,open()函数将尝试打开u"espa\xf1ol.jpg",并且这会导致IOError。在试图修复此问题的过程中,我已经在两个系统上检查了sys.getfilesystemencoding(),两者都设置为utf-8(虽然Ubuntu报告大写字母,即UTF-8,不确定是否相关)。我还在python文件中设置了# -*- coding: utf-8 -*-,但我确定这仅影响文件内部的编码,而不影响任何外部功能或python如何处理系统资源。该文件在两个系统上都存在,并正确显示了eñe。
最终的问题是:如何在Ubuntu系统上打开español.jpg文件?
编辑: 实际上,español.jpg字符串是通过Django的ORM(ImageFileField)从数据库中获取的,但到我处理它并看到行为差异的时候,我有一个单一的unicode字符串,其中包含了文件的绝对路径。
"\xf1"
是"ñ"
的ISO-8859-1表示。 - Sven Marnachespañol.jpg
的文件,并使用您的方法打开它,在我的 Arch Linux 上正常工作。你能粘贴一下你的 Ubuntu 的locale
输出吗? - Felix Yanlocale
给出了许多参数,包括LANG
,其值为en_US.UTF-8
。 - mrmagooey"\xF1"
字节串,而是u"\xF1"
Unicode 字符串。它等于u"ñ"
,因此源的编码是正确的。在 Ubuntu 中,这对我来说很好用。我想有可能是文件系统没有正确的编码(例如,如果它是使用错误选项挂载的 NTFS 分区)。你遇到了什么 IOError 错误?如果你使用os.listdir('/direc/tories')
(字节串),你会得到什么结果? - bobinceos.listdir('/direc/tories')
,我会得到文件列表作为字符串对象,其中Unicode字符以两位十六进制格式打印(即\xf1
)。它应该将其加载为Unicode对象吗? - mrmagooey