来自 MySQL 数据库的数据编码问题
Encoding Issue with data from MySQL database
我有一个 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 上编写了脚本的其余部分,重写起来会很痛苦。有没有我不知道的方法可以做到这一点?
尝试先转换为字节,然后解码 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'
是的,您有所谓的 Mojibake; it could be Latin-1, or it could be Windows Codepage 1252 或其他密切相关的编解码器。
您可以尝试编码为 Latin-1,然后再次解码:
faulty_text.encode('latin1').decode('utf8')
但是,有时,尤其是对于 CP1252 Mojibakes,错误的编码会导致无法合法 将文本编码回字节,因为某些 UTF-8 字节 'decoded' 即使编解码器不支持这些字节也强制执行。
最好的办法是安装 ftfy
library,它可以自动 为您修复此类 Mojibake 错误。它包括用于正确撤消 CP1252 Mojibakes 的特殊编解码器(以及其他相关代码页),绕过上述问题的编解码器。
我有一个 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 上编写了脚本的其余部分,重写起来会很痛苦。有没有我不知道的方法可以做到这一点?
尝试先转换为字节,然后解码 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'
是的,您有所谓的 Mojibake; it could be Latin-1, or it could be Windows Codepage 1252 或其他密切相关的编解码器。
您可以尝试编码为 Latin-1,然后再次解码:
faulty_text.encode('latin1').decode('utf8')
但是,有时,尤其是对于 CP1252 Mojibakes,错误的编码会导致无法合法 将文本编码回字节,因为某些 UTF-8 字节 'decoded' 即使编解码器不支持这些字节也强制执行。
最好的办法是安装 ftfy
library,它可以自动 为您修复此类 Mojibake 错误。它包括用于正确撤消 CP1252 Mojibakes 的特殊编解码器(以及其他相关代码页),绕过上述问题的编解码器。