2017-02-07 2 views
1

Я написал код в Python 3.5, где я использовал Tweepy & SQLAlchemy & следующие строки для загрузки твитов в базу данных, и она работала хорошо:Как обрабатывать кодирования в Python 2.7 и SQLAlchemy ☠️

twitter = Twitter(str(tweet.user.name).encode('utf8'), str(tweet.text).encode('utf8')) 
session.add(twitter) 
session.commit() 

Используя тот же самый код сейчас в Python 2.7 вызывает ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 139: ordinal not in range(128)

Что такое решение? Моя конфигурация MySQL заключается в следующем:

стороне сервера -> Кодировка utf8mb4

стороне клиента ->create_engine('mysql+pymysql://abc:de[email protected]/def', encoding='utf8', convert_unicode=True)):

UPDATE

Кажется, что нет никакого решения , по крайней мере, не с Python 2.7 + SQLAlchemy. Вот что я узнал до сих пор, и если я ошибаюсь, пожалуйста, поправьте меня.

Tweepy, по крайней мере, в Python 2.7, возвращает объекты типа Unicode.

В Python 2.7: tweet = u'☠' является <'unicode' type>

В Python 3.5: tweet = u'☠' является <'str' class>

Это означает, что Python 2.7 даст мне 'UnicodeEncodeError', если я str(tweet), потому что Python 2.7 затем пытается кодировать этот символ «☠» в ASCII, что невозможно, поскольку ASCII может обрабатывать только this basic characters.

Вывод:

Используя только это утверждение tweet.user.name в SQLAlchemy линии дает мне следующую ошибку:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

Используя либо это заявление tweet.user.name.encode('utf-8') или это один str(tweet.user.name.encode('utf-8')) в SQLAlchemy линии должны реально работать право но он показывает мне незакодированные символы на стороне базы данных:

ð´ââ ï¸Jack Sparrow

Это то, что я хочу, чтобы показать:

Отпечатано: ‍☠️ Jack Sparrow

Специальные символы юникода: u'\U0001f3f4\u200d\u2620\ufe0f'

Специальные символы UTF-8 кодировка: '\xf0\x9f\x8f\xb4\xe2\x80\x8d\xe2\x98\xa0\xef\xb8\x8f'

ответ

0

Не используйте закодировать/декодировать функции; они только осложняют проблемы.

Установите соединение UTF-8.
Установите столбец/таблицу в utf8mb4 вместо utf8.
Используйте # -*- coding: utf-8 -*- в начале кода Python.

Подробнее Python tips Обратите внимание, что у него есть ссылка на «Проблемы с Python 2.7, улучшения в Python 3».

+0

Это: '# - * - кодирование: utf-8 - * -' это просто комментарий и только соглашение или оно приносит какое-либо значение коду? – saitam

+2

'# - * - кодирование: utf-8 - * -' говорит интерпретатору, кодирование которого используется при разборе файла, оно затрагивает только файлы, содержащие символы не-ascii (литералы). Это никак не влияет на код. Кроме того, посмотрите раздел [mysql unicode в документе sqlalchemy doc] (http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#unicode), вам нужно добавить '? Charset = .. . 'к вашему соединению url для изменения кодировки соединения – mata

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