Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Python3: Символы \x90 \x8D \x8F \x8D \x81 в тексте с кодировкой cp1252

#mysql #python #кодировка #python_3x #utf_8


При получении данных из таблицы 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? Или
где ещё может быть источник проблемы?
    


Ответы

Ответ 1



Нашёл ответ!) При импорте базы данных нужно использовать кодировку 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.

Комментариев нет:

Отправить комментарий