Преобразование неправильно закодированных китайских символов в MySQL в UTF-8

У меня есть большая таблица MySQL, заполненная китайскими символами в неправильной кодировке. Я полагаю, что они должны были быть закодированы в latin1 (iso-8859-1), но я просто не могу найти способ получить китайские символы из содержимого строк базы данных.

Преобразование между latin1 и utf8 не помогает - поля остаются неизменными. Я пытался повторно импортировать базу данных с различными кодировками - всегда одинаковые результаты.

Некоторые примеры текущего содержимого и какими они должны быть:

  • 惨事 должно быть 惨事

  • äдолжно быть

  • 最 должно быть

Я также пытался использовать Python, чтобы попытаться "расшифровать" содержимое, но снова безуспешно. Я пробовал различные комбинации этого:

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

Но я не могу заставить что-либо подобное работать.

Извините, что задал такой расплывчатый вопрос, но я просто не знаю, как продолжать пытаться понять это!

Кто-нибудь знает в чем здесь проблема?

1 ответ

Решение

Вместо этого вы смотрите UTF-8, декодированный как кодовая страница Windows 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/stackru-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 приведет к аналогичному результату, например, с незначительными отличиями.

Другие вопросы по тегам