将MySQL中错误编码的中文字符转换为UTF-8

时间:2013-08-16 10:54:51

标签: python mysql encoding utf-8 latin1

我有一个大型MySQL表,其中填充了不正确编码的中文字符。我相信它们应该用latin1(iso-8859-1)编码,但我找不到从数据库行的内容中获取中文字符的方法。

在latin1和utf8之间转换没有帮助 - 字段保持不变。我尝试使用各种编码重新导入数据库 - 总是相同的结果。

当前内容的一些示例以及它们应该是什么:

  • 惨事应为惨事

  • ä¸应为

  • 最应为

我也尝试使用Python来尝试“解码”内容,但是再次没有成功。我尝试了各种组合:

databasefield.decode('iso-8859-1').encode('utf8')

但我也无法做到这一点。

很抱歉提出这么模糊的问题,但我不知道如何继续尝试解决这个问题!

有谁知道这里的问题是什么?

1 个答案:

答案 0 :(得分:3)

您正在将UTF-8解码为Windows codepage 1252而不是:

>>> print u'惨事'.encode('utf8').decode('cp1252')
惨事
>>> print u'最'.encode('utf8').decode('cp1252')
最

解决这个问题需要采取另一种方式:

>>> print u'惨事'.encode('cp1252').decode('utf8')
惨事
>>> print u'最'.encode('cp1252').decode('utf8')
最

虽然可能有一些丢失,因为的UTF-8编码使用了1252不支持的代码点:

>>> u'不'.encode('utf8')
'\xe4\xb8\x8d'
>>> print u'不'.encode('utf8').decode('cp1252')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 2: character maps to <undefined>

有几个其他Windows代码页候选人可以在这里尝试; 1254会产生类似的输出,例如,只有很小的差异。