【问题标题】:Strange `UnicodeEncodeError` using `os.path.exists`使用`os.path.exists`的奇怪`UnicodeEncodeError`
【发布时间】:2012-05-10 21:18:47
【问题描述】:

在 web 应用程序中(使用 Flask),我收到以下错误:

Unable to retrieve the thumbnail for u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg'
Traceback (most recent call last):
 File "/var/www/beta/env/lib/python2.7/site-packages/dblib-1.0dev3-py2.7.egg/dblib/orm/file.py", line 169, in get_thumbnail
   if not exists(filename):
 File "/usr/lib/python2.7/genericpath.py", line 18, in exists
   os.stat(path)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 52: ordinal not in range(128)

请注意,我在记录的错误中包含了文件名的repr()。这表明文件名是作为 Unicode 实例传递的。说的太对了……

如果我使用 python 解释器运行罪魁祸首,它会按预期工作:

>>> from os.path import exists
>>> exists(u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg')
True

很明显,在 Flask 环境中运行时,Python 认为它应该使用 ASCII 编解码器而不是 UTF-8 对文件名进行编码。我在 Apache httpd 后面使用 mod_wsgi 部署了应用程序。

我假设我必须告诉他们中的任何一个在某处使用 UTF-8?但是在哪里?

【问题讨论】:

  • 不认为这是正确的解决方案,但在类似情况下,我发现自己使用 'string'.encode('utf8') 就可以解决问题 - 可能值得一试。
  • 我确定这是配置问题。所以,在我找到正确的设置之前,我只是用一个 try/except 块来保护它,每次它发生时都会向我发送电子邮件:P 这是一个错误,我想提醒它:)

标签: python apache unicode flask


【解决方案1】:

查看 Django 文档以了解相同的问题。使用 mod_wsgi 时,应该是一样的解决方案:

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror

摘自上述链接文档:

[...] 您必须确保用于启动 Apache 的环境是 配置为接受非 ASCII 文件名。如果你的环境不是 正确配置,会触发 UnicodeEncodeError 异常 当在文件名上调用 os.path 中的函数时 包含非 ASCII 字符。

为了避免这些问题,用于启动 Apache 的环境应该 包含类似于以下内容的设置:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

请查阅您的操作系统的文档以了解 放置这些配置项的适当语法和位置; /etc/apache2/envvars 是 Unix 平台上的常见位置。一次 您已将这些语句添加到您的环境中,请重新启动 Apache。

【讨论】:

猜你喜欢
  • 2016-07-27
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2018-01-15
  • 2010-09-14
  • 2017-10-03
  • 2011-12-19
相关资源
最近更新 更多