gpt4 book ai didi

python - 从 Django 打印时出现 UnicodeEncodeError

转载 作者:行者123 更新时间:2023-11-28 21:56:57 25 4
gpt4 key购买 nike

使用python解释器

>>> print u'\xe9'
é

但是如果我将同一行放在 Django View 中,我会得到

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 项目,它使用第 3 方模块来处理一些字符串,并打印它们。当在 Django 外部使用该模块时,它工作正常,但当将它用作 Django 项目的一部分时,它会在尝试打印非 ascii 字符时崩溃。我真的不关心打印,只关心它正在做的其他事情。

最佳答案

Python print 语句会自动将 Unicode 值编码为用于 sys.stdout 的编解码器。

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

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

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

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())

关于python - 从 Django 打印时出现 UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com