【问题标题】:UnicodeEncodeError on MySQL insert in PythonPython中MySQL插入的UnicodeEncodeError
【发布时间】:2009-11-14 00:30:47
【问题描述】:

我使用 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”并将其写入数据库?

【问题讨论】:

    标签: python mysql unicode


    【解决方案1】:

    你想要text.encode('utf8')

    【讨论】:

      【解决方案2】:
      >>> print text
      u'Waldenstr\xf6m'
      

      在 shell 中显示某些内容(使用repr)和打印它(只是吐出字符串)是有区别的:

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

      所以,我不确定你上面的 sn-p 是否真的发生了。如果确实如此,那么您的 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
      

      如果顶部的 sn-p 实际上不太正确,而您只是在问为什么 Python 的 repr 会转义所有非 ASCII 字符,答案是在各种环境中打印非 ASCII 到控制台是不可靠的,所以逃生更安全。在上面的例子中,如果你运气不好,你可能会收到?s 或更糟的,而不是ö

      在 Python 3 中,这发生了变化:

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

      【讨论】:

        猜你喜欢
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 2014-09-03
        • 2021-02-25
        • 2012-05-08
        相关资源
        最近更新 更多