提问人:Deniz Dogan 提问时间:5/1/2009 更新时间:5/14/2009 访问量:1328
Django 和 lxml 中的解码问题
Decoding problems in Django and lxml
问:
在使用我的 Django 应用程序的已部署版本时,我对 lxml 有一个奇怪的问题。我使用 lxml 解析我从服务器获取的另一个 HTML 页面。这在我自己的计算机上的开发服务器上运行良好,但由于某种原因,它让我在服务器上。UnicodeDecodeError
('utf8', "\x85why hello there!", 0, 1, 'unexpected code byte')
我已经确保Apache(带有mod_python)与.LANG='en_US.UTF-8'
我尝试在谷歌上搜索这个问题,并尝试了不同的方法来正确解码字符串,但我无法弄清楚。
在你的回答中,你可能会认为我的字符串被调用了。hello
答:
-2赞
ismail
5/1/2009
#1
由于修改 site.py 不是一个理想的解决方案,因此在程序开始时尝试以下操作:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
评论
0赞
Deniz Dogan
5/1/2009
有趣!你不知道我的程序在 Django 中的开始是什么?
0赞
ismail
5/1/2009
在调用任何与 lxml 相关的代码之前调用此代码应该可以解决此问题。
0赞
David Berger
5/1/2009
为什么导入后立即调用 reload?它应该在sys.setdefaultencoding之后调用吗?
0赞
Jeremy Dunck
5/12/2009
需要 reload(sys) 的原因是 python 的站点模块专门删除了它。这是因为使用 setdefaultencoding 的客户端代码就像一只拿着枪的猴子。请阅读 joelonsoftware.com/articles/Unicode.html 和 groups.google.com/group/comp.lang.python/browse_thread/thread/...只是不要这样做。
3赞
Jochen Ritzel
5/3/2009
#2
“\x85why hello there!” 不是 UTF-8 编码的字符串。在将网页传递给 lxml 之前,您应该尝试解码该网页。通过查看 http 标头来检查它使用的编码,当您获取页面时,也许您在那里发现了问题。
评论
0赞
landyman
5/12/2009
同意。试试“\x85why hello there!”。解码(“UTF-8”)。这会将非 unicode 代码 (\x85) 更改为 unicode 代码。您可能还需要在 .py 文件的顶部添加:“# -- 编码:utf-8 --”(不带引号)。
0赞
Jeremy Dunck
5/12/2009
我同意这可能是由于您返回的字节字符串实际上不是 utf-8 引起的。一般来说,如果你声称要创建一个 UTF-8 字符串,你应该在内部使用 unicode 类型,并且在将位放在网络上之前,编码为 utf-8。如果你把字节串放在一起,你几乎肯定会在某个地方搞砸,然后在很久以后的某个地方发现它。FWIW, “\x85” == “#”。
0赞
Alex
5/14/2009
#3
语法没有帮助吗?u"\x85why hello there!"
您可能会发现官方 Python 文档中的以下资源很有帮助:
评论