python - Django shell 编码错误(仅限 Debian,Ubuntu 没问题)

标签 python unicode terminal

美好的一天

有人可以解释一下 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。

如果我删除这个打印地址字符串,我会收到不可读的地理位置错误,但同样 - 仅在 Debian 上。 Ubuntu 工作得很好:

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

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

所以我就是无法得到它。机器之间的差异是什么给我带来这么多麻烦?

最佳答案

如果运行以下 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')

输出为:

Encode from ISO8859-1 to UTF-8: Челябинск

Encode from ISO8859-1 to UTF-8: ЧелÑбинÑк

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

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

如果有人可以添加到此答案中,请这样做。

关于python - Django shell 编码错误(仅限 Debian,Ubuntu 没问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432533/

相关文章:

python - __init__ 中的变量在一个函数中发生更改,但未被识别为更改为其他函数

python - 如何修复 ruby 错误: sh: 1: make: not found

python - 删除非unicode字符python

python - 为什么在 python -c 中插入 unicode 字符抛出异常

bash - 对于 tmux 下的 $TERM ='screen-256color',HOME 和 END 键不起作用。为什么?

c - 程序使用终端名称而不是用户输入

python - 当我打印 args 时,我没有得到元组中的所有元素的原因是什么。这里 args[0] 打印 2 而不是 1。

python - Nicing 正在运行的 python 进程?

jquery - 使用 json_write() 时有两个 unicode 代码点?

linux - Linux:-bash ./(program_name):权限被拒绝