【问题标题】:Django shell encoding error (Debian only, Ubuntu fine)Django shell 编码错误(仅限 Debian,Ubuntu 很好)
【发布时间】:2011-09-15 14:29:31
【问题描述】:

美好的一天

有人能解释一下 Django manage.py shell 控制台背后发生了什么吗? 问题如下。我正在开发一个 Django 应用程序,它使用 urllib 来解析一些 html 页面以从中获取一些信息。而且该信息是俄语,所以它应该是 unicode(在这种情况下是地址字符串)。接下来,我的脚本将它提供给其他一些第三方模块,因为它不是有效的 unicode 字符串(我正在尝试从地址对点进行地理解码)。 我尝试使用print address 命令将字符串(在本例中为解析地址)打印到控制台,但它失败了:

File "<console>", line 1, in <module>
... some useless stacktrace ...    
    print address
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

现在是有趣的部分。
我有 2 台计算机:带有 Ubuntu 和 Python 2.7.2 的工作站和带有 Python 2.7.2 的 Debian Lenny VPS。我在两台机器上以相同的方式启动解析器:通过执行 python manage.py shell 并从中调用我的函数。
首先,我在两个安装中都遇到了同样的错误,但后来我注意到我的 python 编码设置为“ascii”(import sys; sys.getdefaultencoding())。当我把

import sys; reload(sys).setdefaultencoding('utf-8')

进入 settings.py 问题解决了 Ubuntu。现在我得到了正确的打印,例如г. Челябинск, ул. Кирова, д. 27, КТК Набережный,但这不适用于 Debian。

如果我删除了这个print address 字符串,我会收到不可读的地理定位错误,但同样 - 仅在 Debian 上。 Ubuntu 运行良好:

Failed to geodecode address [г. ЧелÑбинÑк, Ñл. 1-ой ÐÑÑилеÑки, 17/1, ÑÑнок ÐÑÑак, 1-з]

再多的unicode(address).encode('utf-8') 魔法也无济于事。

所以我无法得到它。给我带来这么多麻烦的机器有什么区别?

【问题讨论】:

  • 这很有趣。出于所有意图和目的,Ubuntu Debian。

标签: python unicode terminal


【解决方案1】:

如果你运行下面的 python 脚本,你会看到发生了什么:

# -*- coding: utf-8 -*-
a = r"Челябинск"
print "Encode from UTF-8 to UTF-8:",unicode(a,'utf-8').encode('utf-8')
print "Encode from ISO8859-1 to UTF-8:",unicode(a,'iso8859-1').encode('utf-8')

输出是:

从 ISO8859-1 编码为 UTF-8:Челябинск

从 ISO8859-1 编码为 UTF-8:ЧелÑбинÑк

本质上,您将(已经)编码为 UTF-8 的字符串并将其重新编码(第二次,就好像它是 ISO8859-1)为 UTF-8。

值得检查每种情况下机器的默认编码是什么。

如果有人可以添加到这个答案,那么请这样做。

【讨论】:

  • 感谢您的回复。在后来的检查中,我和我的老板发现是 lxml 模块造成了这么多麻烦。我们试图通过正确使用 unicode 字符串从系统编码中筛选出我们的代码。但是,lxml 得到了一个 html 页面,它使用系统编码对其进行了解码,并且在服务器上它猜错了。我们已经通过解析 html 页面的相应 META 并正确编码其内容来解决此问题。但是感谢您的回答 - 它非常有启发性。
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2013-06-05
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多