繁体   English   中英

Python - 'ascii' 编解码器无法对位置 5 中的字符 u'\\xe9' 进行编码:序号不在范围内(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})

更新的问题

  • Python 版本:2.7.6
  • Models.py 当前为空

同样奇怪的是,如果我删除它:

{% 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM