【问题标题】:Encoding Issue with data from MySQL database来自 MySQL 数据库的数据的编码问题
【发布时间】:2016-01-15 20:57:00
【问题描述】:

我有一个存在编码问题的 sql 数据库,所以它返回的结果与此类似:

"Cuvée"

据我所知,这是因为它在应该编码为 UTF-8 时被编码为 latin-1(如果我错了,请纠正我)。我正在 Python 脚本中处理这些结果,并且遇到了一些编码问题,并且无法将其转换回应有的状态:

"Cuvée"

我使用的是 Python 3.3,但通过使用 codecs.decode 将 latin1 更改为 utf-8,我得到了:

'str' does not support the buffer interface

我想我已经尝试了所有我发现无济于事的方法。我不太热衷于使用 Python 2.7,因为我已经在 3.3 上编写了脚本的其余部分,而且重写会很痛苦。有没有我不知道的方法来做到这一点?

【问题讨论】:

    标签: python encoding utf-8 iso-8859-1 mojibake


    【解决方案1】:

    是的,你有所谓的Mojibake;它可以是 Latin-1,也可以是 Windows Codepage 1252 或其他密切相关的编解码器。

    可以尝试编码为 Latin-1,然后再次解码:

    faulty_text.encode('latin1').decode('utf8')
    

    但是,有时,尤其是使用 CP1252 Mojibakes,错误的编码会导致无法合法将文本编码回字节,因为即使编解码器没有强制“解码”某些 UTF-8 字节'不支持那些字节。

    您最好安装ftfy library,它可以自动为您修复此类 Mojibake 错误。它包括用于正确撤消 CP1252 Mojibakes(以及其他相关代码页)的特殊编解码器,以及绕过上述问题的编解码器。

    【讨论】:

      【解决方案2】:

      尝试先转换为字节,然后再解码 unicode。根据您的示例:

      latin_string = "Cuvée"
      # Get a byte representation of the latin string
      bytes(latin_string,'latin-1')
      b'Cuv\xc3\xa9e' # Note the preceding b
      # Get a byte representation and decode the utf-8 to get a 'pretty' string
      bytes(latin1string,'latin-1').decode('utf-8')
      'Cuvée'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 2017-04-06
        相关资源
        最近更新 更多