在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?但在哪里?
答案 0 :(得分:18)
请参阅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。