0

我在 32 位 CentOS 5.8 上的 Python 中的文件 open() 有问题。在文件名中使用 ascii 之外的字符时,出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 88: ordinal not in range(128)

违规行是

file = open(full_path, 'w')

该代码在 64 位 Ubuntu 12.10 和 64 位 CentOS 6.3 上运行良好。

来自发生错误的服务器的一些信息:

$ python --version
Python 2.7.3
$ cat /etc/redhat-release 
CentOS release 5.8 (Final)
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

我检查了 Ubuntu 机器上的“full_path”变量的类型是“unicode”。“full_path”变量的一部分来自 UTF-8 格式的配置文件。其余部分来自 UTF-8 格式的网页。

我还没有在 CentOS 5.8 机器上进行任何测试,因为它是生产服务器,我宁愿不对其进行随机测试。任何可能导致此错误的原因的提示都表示赞赏。

更新

如果忘记提及以下工作:

$ python
Python 2.7.3 (default, Jun 11 2012, 22:26:11) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> file = open(u'ø.txt', 'w')
>>>

在我看来,这应该与实际程序相同,但显然不是。

更新 2

现在它出于某种原因工作。该程序是一个 Turbogears Web 应用程序,我刚刚启动并停止了服务器守护程序以查看一些调试打印的结果,并且不再发生错误。

我仍然不知道为什么会发生这种情况,但至少问题暂时解决了。

4

1 回答 1

0

我不确定这是否可以作为解决方案,但我遇到了这样的错误。我解决了,但我现在有一些副作用(查看我的个人资料)。尝试:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
于 2012-11-03T14:50:23.363 回答