![](/img/trans.png)
[英]UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 54: ordinal not in range(128)
[英]Python - 'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)
我正在尝试运行一个快速的 Django 应用程序,该应用程序从 Google AdWords 中提取数据并公开由代理机构管理的帐户名称。 这样做时,我收到以下错误:
UnicodeEncodeError at /account-hierarchy/
'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)
这是片段:
<table class="pretty-table">
<thead>
<tr>
<td>Customer ID</td>
<td>Client Name</td>
<td>Can Manage Clients</td>
<td>Account Currency</td>
</tr>
</thead>
{% for account in managed_accounts %}
<tr>
{% for field in account %}
<td>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
其中对{{ field }}
的调用是有问题的行。
我已经添加了
<meta http-equiv="content-type" content="text/html; charset=utf-8">
到我正在渲染的模板,但它仍然失败,所以我相信问题不在于 HTML 模板,而在于 Python/Django 引擎。
有什么想法可以解决吗?
这是呈现模板的视图代码:
def account_hierarchy(request):
manager_ids = settings.MANAGER_IDS
managed_accounts = []
for manager_id in manager_ids:
managed_accounts.extend(adwords_utils.getManagedAccounts(manager_id))
return render_to_response('simple-table.html', {"managed_accounts": managed_accounts})
更新的问题
同样奇怪的是,如果我删除它:
{% for field in account %}
<td>{{ field }}</td>
{% endfor %}
我只是打印出主数组:
{{ managed_accounts }}
它工作得很好。 不知道发生了什么。
奇怪的事实 #2:当我设法输出完整数组时,我检查了字符 'é',但在最终输出中没有找到它。 不知道它是从哪里来的。
问题很可能是,在您的代码中的某个地方,您不小心将数据结构定义为 Python 字节字符串,而您应该将其定义为 Python Unicode 字符串。 这导致 Django 和 Python 以默认方式使用 ASCII 编解码器从 Django 的 Unicode 字符串转换为您的字节字符串。
错误消息提供了一些线索:
account_hierarchy()
时可能会发生错误character u'\\xe9' in position 5: ordinal not in range(128)
的短语character u'\\xe9' in position 5: ordinal not in range(128)
表示 Python 正在尝试将 Unicode 字符 'é' (U+00E9) 转换为 0..127 的 ASCII 值。 在您的数据中查找“é”。 它在哪个领域?'ascii' codec
意味着转换可能是无意的。 如果您打算使用 UTF-8,您就不会故意调用 ASCII 编解码器。 但是当您进行转换但未指定编解码器时,Python 使用 ASCII。encode
一词意味着从 Unicode 转换为面向字节的编码。 你已经读过几次Python 的Unicode HOWTO文章,不是吗?函数render_to_response()使用设置DEFAULT_CHARSET和 DEFAULT_CONTENT_TYPE]( https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DEFAULT_CONTENT_TYPE )。 它们应该默认为“utf-8”和“text/html”,这应该适合生成 UTF-8 编码的 HTML 页面,但请检查。
我喜欢建议您检查models.py
以确保您的模型是根据 Unicode 数据类型而不是字节字符串数据类型定义的。 更新:你说 models.py 是空的,所以不会有太大帮助。
字符处理以及 Unicode 与字节字符串在 Python 2 和 Python 3 中的处理方式不同。您使用的是哪个版本的 Python? 更新:Python 2.7.6,谢谢。 我上面链接的Unicode HOWTO适用于 Python 2.7.x。
如果您确保您的代码始终将字符串作为 Unicode 处理,除非您真的想要一个字节字符串,这可能会解决这个问题。
更新:考虑修改您的模板以提供调试信息。 尝试类似这些表达式,以查看managed_accounts
的真正内容:
</thead>
<tr><td>managed_accounts is: {{ repr(managed_accounts) }}</tr></td>
{% for account in managed_accounts %}
<tr>
{% for field in account %}
<td>{{ type(field) }}, {{ repr(field) }}</td>
{% endfor %}
</tr>
{% endfor %}
[更新以响应原始海报的多次更新。]
你的问题和我的一样,只是编码问题,你可以在django项目的views.py中添加波纹管代码:
1. #coding=utf-8
2. import sys
3. reload(sys)
4. sys.setdefaultencoding('utf-8')
我的问题:模板渲染时出错 在模板 D:\\PythonProjects\\DjangoProject\\guest\\sign\\templates\\sign\\guest_manage.html 中,第 72 行的错误在此处输入图像描述
这是属于 jinja2 模板的问题,将通过将编码设置为 utf-8 作为默认编码来解决。
sys.setdefaultencoding('utf-8')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.