При получении данных из таблицы MySQL (используя Connector/Python) текстовые строки имеют вид:
Калашникова Елена Сергеевна
и
Тищенко Ð\x90ндрей ВаÑ\x81ильевич
Декодер показывает, что это кодировка CP1252, поэтому в Python3 мы можем обработать их str.encode('cp1252').decode('utf8'), однако если этот метод работает для первой строки, то не работает для второй.
UnicodeEncodeError: 'charmap' codec can't encode character '\x90' in position 16: character maps to undefined
Проблема - в специальных символах \x90, \x9D, \x8F, \x8D, \x81. В описании Windows-1252 указано, что эти коды относятся к C1 control codes.
Каким образом можно декодировать эти строки в Python3, не изменяя базу MySQL? Или где ещё может быть источник проблемы?
Ответ
Нашёл ответ!)
При импорте базы данных нужно использовать кодировку latin1
Тогда в Python3 для декодирования таких строк необходимо выполнить str.encode('latin1').decode('utf8')
На решение натолкнула эта статья - Solving Latin1 and UTF8 errors for good in Ruby
Latin1 is a character encoding used by MySQL. People mistakenly think it is equivalent to ISO-8859-1 but it isn’t, it’s actually CP-1252 (also known as Windows-1252). CP-1252 is a superset of ISO-8859-1 with some additional characters (recently including the € symbol).
Соответcnвенно, я нашёл в списке поддерживаемых кодировок latin1, и использовал её при подключении к MySQL с помощью Connector/Python.
Комментариев нет:
Отправить комментарий