【问题标题】:How to detect parts of unicode in a string in Python如何在 Python 中检测字符串中的 unicode 部分
【发布时间】:2018-02-07 15:02:37
【问题描述】:

我调用一个 api 来获取一些信息,有时响应中有如下示例。

"address": "BOULEVARD DU MÃ\u0089ROU - SN PEÃ\u008fRE,  "

如何检测这些并将它们转换为拉丁字母?我想将此数据上传到 MYSQL 数据库。现在它会引发以下警告。

Warning: (1366, "Incorrect string value: '\\xC2\\x88ME A...' for column 'address' at row 1")

我正在使用 pymysql,将此信息插入数据库。

【问题讨论】:

    标签: mysql python-3.x unicode pymysql


    【解决方案1】:

    示例数据最初编码为 UTF8,但解码为 latin1。您可以反转该过程来修复它,或者使用utf8 从源代码读取它:

    >>> s = "BOULEVARD DU MÃ\u0089ROU - SN PEÃ\u008fRE,  "
    >>> s.encode('latin1').decode('utf8')
    'BOULEVARD DU MÉROU - SN PEÏRE,  '
    

    【讨论】:

      【解决方案2】:

      您可以使用.encode() str 函数:

      >>> "BOULEVARD DU MÃ\u0089ROU - SN PEÃ\u008fRE,  ".encode("latin-1)
      'BOULEVARD DU MÉROU - SN PEÏRE,  '
      

      但请注意,如果 API 响应包含任何无法以“latin-1”编码的 UTF-8 字符,那么您将遇到 UnicodeEncodeError

      如果可能的话,您可能希望将 mysql 数据库的字符集更改为 UTF-8,而不是这样做

      【讨论】:

      • 那是 Python 2,对吧? OP 用python-3.x 标记了这个问题,这在这里非常相关。在 Python 3 中,str.encode 总是返回一个字节字符串。
      【解决方案3】:

      您似乎有多个错误 - “双重编码”和 unicode “代码点”。因此,很难弄清楚出了什么问题。

      最好回到源头并在每个阶段修复编码 - 不要在混乱之后尝试编码/解码。如果您在每个阶段都指定 UTF-8,几乎在所有情况下不需要转换代码。

      这里有一些关于在 Python 中做什么的注释:http://mysql.rjweb.org/doc.php/charcoll#python

      É 的十六进制数应为 C389Ï 的十六进制数应为 C38F。除了 HTML 之外,不应该有 \uxxxx。即使在 HTML 中,通常也最好简单地使用 utf8 编码,因为 HTML 可以处理这种情况。

      【讨论】:

        猜你喜欢
        • 2021-11-03
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2016-01-09
        • 2016-09-20
        • 1970-01-01
        相关资源
        最近更新 更多