2013-08-16 2 views
2

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

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

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

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

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

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

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

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

Но я тоже не могу работать.

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

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

+0

Ваш * первый * пример имеет дополнительные символы * между * latin1 байтами, которые составляют UTF-8 для двух правильных глифов. 'u '惨 事' .encode ('utf8'). decode ('latin1')' приводит к 'æ¨äº' .. –

+0

Ах, некоторые байты не подлежат печати, поэтому' u '\ xe6 \ x83 \ xa8 \ xe4 \ xba \ x8b'' - это результат, и вместо этого он выглядит как кодовая страница Windows. Думаю, я нашел ваше решение, позвольте мне проверить. –

+0

Вы можете указать нам * представление * этих значений. Что дает 'repr (база данных)' дает вам для каждого из них? Возможно, мы смотрим на то, что ваша кодовая страница Windows думает, что байты, например. –

ответ

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 приведет к аналогичному выводу, например, только с незначительными отличиями.

Смежные вопросы