Python 中 MySQL 插入时的 UnicodeEncodeError
我使用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排序规则的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
>>> print text
u'Waldenstr\xf6m'
在命令行中显示东西和打印东西是有区别的。前者使用的是 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'
2
你需要用 text.encode('utf8')
这个方法来处理文本。