编码来自MySQL数据库的数据问题

时间:2016-01-15 20:57:00

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

我有一个有编码问题的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上编写了其余的脚本,重写起来会非常痛苦。有没有办法做到这一点,我不知道?

2 个答案:

答案 0 :(得分:1)

首先尝试转换为字节,然后解码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'

答案 1 :(得分:1)

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

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

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

然而,有时候,特别是对于CP1252 Mojibakes,错误的编码导致文本不能合法地被编码回字节,因为一些UTF-8字节被解码'即使编解码器不支持这些字节,也要强有力。

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