Python - 'ascii'编解码器不能对位置5中的字符u'\ xe9'进行编码:序数不在范围内(128)

时间:2014-12-12 01:52:49

标签: python django python-unicode

我正在尝试运行一个快速的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:当我设法输出完整数组时,我检查了字符'é',但我没有在最终输出中找到它。不知道它来自哪里。

3 个答案:

答案 0 :(得分:4)

问题很可能是,在您的代码中的某个位置,您意外地将数据结构定义为Python字节字符串,而您应该将其设置为Python Unicode字符串。这导致Django和Python使用ASCII编解码器以默认方式从Django的Unicode字符串转换为字节字符串。

错误消息提供了一些线索:

  • 当您致电account_hierarchy()
  • 时,可能会发生错误
  • 短语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's Unicode HOWTO article几次,不是吗?

功能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。

如果你确保你的代码在整个过程中处理字符串,除非你真的想要一个字节字符串,这可能会解决这个问题。

更新:考虑修改模板以提供调试信息。尝试类似这些表达式的内容,看看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 %}

[更新了以响应原始海报的多次更新。]

答案 1 :(得分:0)

您的问题与我的问题相同,只需编码问题,您可以在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行出错 enter image description here

答案 2 :(得分:0)

此问题属于jinja2模板,可以通过将编码设置为utf-8作为默认编码来解决。

Author.Country