MySQL上的UnicodeEncodeError插入Python

时间:2009-11-14 00:30:48

标签: python mysql unicode

我使用lxml来解析一些网页,如下所示:

>>> doc = lxml.html.fromstring(htmldata)
>>> element in doc.cssselect(sometag)[0]
>>> text = element.text_content()
>>> print text
u'Waldenstr\xf6m'

为什么打印u'Waldenstr \ xf6m'而不是“Waldenström”?

之后,我尝试将此文本添加到具有UTF-8字符集和utf8_general_ci collat​​io的MySQL表中,Users是Django模型:

>>> Users.objects.create(last_name=text)
'ascii' codec can't encode character u'\xf6' in position 9: ordinal not in range(128)

我在这里做错了什么?如何获取正确的数据“Waldenström”并将其写入数据库?

2 个答案:

答案 0 :(得分:2)

你想要text.encode('utf8')

答案 1 :(得分:0)

>>> print text
u'Waldenstr\xf6m'

在shell中显示某些内容(使用repr)和打印它(只是吐出字符串)之间存在差异:

>>> u'Waldenstr\xf6m'
u'Waldenstr\xf6m'

>>> print u'Waldenstr\xf6m'
Waldenström

所以,我不确定上面的代码片段是不是真的发生了什么。如果确实如此,那么您的XHTML必须包含该字符串:

<div class="something">u'Waldenstr\xf6m'</div>

(也许Python使用字符串repr()而不是str()错误地生成了它?)

如果这是正确且有意的,则需要将该Python字符串文字解析为一个简单的字符串。一种方法是:

>>> r= r"u'Waldenstr\xf6m'"
>>> print r[2:-1].decode('unicode-escape')
Waldenström

如果顶部的片段实际上不是很正确而且您只是在问为什么Python的repr会转义所有非ASCII字符,那么答案是在控制台上打印非ASCII在各种环境中都是不可靠的,所以逃跑更安全。在上面的示例中,如果您运气不好,可能会收到?或更差,而不是ö

在Python 3中,这会改变:

>>> 'Waldenstr\xf6m'
'Waldenström'