Python 从Django打印时出现UNICODEENCODEER错误

Python 从Django打印时出现UNICODEENCODEER错误,python,django,unicode,character-encoding,django-views,Python,Django,Unicode,Character Encoding,Django Views,使用python解释器 >>> print u'\xe9' é 但如果我在Django视图中放置相同的行,我会 UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128) 为什么呢 我正在使用Django 1.5.1和python 2.6.6 一些背景。。。我有一个Django项目,它使用第三方模块处理一些字符串,并打印

使用python解释器

>>> print u'\xe9'
é
但如果我在Django视图中放置相同的行,我会

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: 
ordinal not in range(128)
为什么呢

我正在使用Django 1.5.1和python 2.6.6


一些背景。。。我有一个Django项目,它使用第三方模块处理一些字符串,并打印它们。当在Django之外使用该模块时,它工作正常,但当将其作为Django项目的一部分使用时,它在尝试打印非ascii字符时崩溃。我并不真正关心打印,只关心它正在做的其他事情。

Python
print
语句将自动将Unicode值编码到用于
sys.stdout
的编解码器中

在控制台或终端中,输出编解码器将自动从系统中拾取。但是,如果将输出重定向到文件,则使用默认的编解码器
ASCII

在服务器上运行的Django应用程序不能依赖将输出编解码器设置为可以处理所有unicode代码点的内容。不要使用
打印
,而是使用日志记录,并显式编码

如果第三方库正在这样做,您需要联系维护人员并要求他们停止这样做。您可以使用上下文管理器来包装对该库的每个调用,该上下文管理器使用虚拟对象(具有适当的
.encoding
属性的对象)替换掉
sys.stdout
,但这只是权宜之计:

from contextlib import contextmanager
from io import BytesIO
import sys

@contextmanager
def capture_stdout_unicode(codec='UTF-8'):
    output = BytesIO()
    output.encoding = codec
    orig, sys.stdout = sys.stdout, output
    try:
        yield output
    finally:
        sys.stdout = orig
然后像这样使用:

with capture_stdout_unicode() as out:
    api_call_that_prints()

logger.info(out.getvalue())

它在哪里打印字符?在哪里失败?对不起,我不确定我是否理解你的问题。在Django视图中执行print u'\xe9'将导致异常。但问题是,为什么要在视图中打印?通常在视图中输出响应。正如我在上面写的,我使用的是第三方模块(由视图调用),它可以进行打印。非常好。非常感谢。对不起,我无法提高你的回答-我还没有足够的声誉:-)没问题,我今天已经达到了声誉上限。:-)