我在 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 应用程序,我刚刚启动并停止了服务器守护程序以查看一些调试打印的结果,并且不再发生错误。
我仍然不知道为什么会发生这种情况,但至少问题暂时解决了。